2014-03-05 58 views
-2

我有這樣的代碼的所有數組項:如何檢查空條件使用LINQ

BenefitValue = premiumResponseMessage.results[0].subItems[0] 
        .profiles[0].subItems[0].profiles[0].subItems[0].profiles[0] 
        .subItems[0].profiles[index].values[0] 

價值分配這裏從一些服務返回。我的問題是我需要檢查每個項目爲空之前使用它。如何使用LINQ最小的代碼行來實現?

+0

爲什麼是線對如此重要的金額您?你不應該數線,而是關心可讀性。 –

+0

是「動態」類型的premiumResponseMessage? – FLCL

+0

是的,它是動態的。 – swathi

回答

1

你應該真正考慮安德烈Snede漢森寫了​​什麼。看起來你在這裏需要的是遞歸的和類型。無論是

,你的LINQ查詢看起來類似的東西:

BenefitValue = from message in premiumResponseMessage.Reuslts.Take(1) 
       where message != null 
       from subItem1 in message.SubItems.Take(1) 
       where subItem1 != null 
       from profile1 in subItem1.Profiles.Take(1) 
       where profile1 != null 
       from subItem2 in profile1.SubItems.Take(1) 
       where subItem2 != null 
       ... etc.. etc 

正如你所看到的,這仍然是醜得要命。考慮使用遞歸函數,深檢索值X平成型材,我沒有測試的代碼

private BenefitValueType GetValueForProfile(SubItemType item, int level, int index) 
{ 
    if ((item == null) || (item.Profiles[0] == null)) 
    { 
     return null; 
    } 
    else if (level == 0) 
    { 
     return item.Profiles[index] != null 
       ? item.Profiles[index].Value[0] 
       : null; 
    } 
    else 
    { 
     return GetValueForProfile(item.Profiles[0].SubItems[0], level - 1, index); 
    } 
} 

通知,也沒有參數驗證...

+1

遞歸是要走的路,我正要給出一個類似的答案,但這可以很好地解決它。 –

2

你永遠不應該做你想做的事情。你打破了Law of Demeter

3個級別下來,你會延伸它,但你的10個級別的數量真的很糟糕。

如果你真的必須,那麼把它分解成小函數。 我看到子項目和配置文件重演。

,並解釋 「級別」:
這將是三個層次:

        //1   2   3 
BenefitValue = premiumResponseMessage.results[0].subItems[0].profiles[0]; 

你的是深10級:

        //1   2   3   .... 
BenefitValue = premiumResponseMessage.results[0].subItems[0].profiles[0].subItems[0].profiles[0].subItems[0].profiles[0].subItems[0].profiles[index].values[0] 
+0

對不起,我知道這X級的含量是什麼意思? – swathi

+1

每一次你檢索另一個配置文件,你潛水的另一個「levlel」......這樣做超過3次,這是一個非常糟糕的做法,你應該考慮更通用的解決方案(意思是一個解決方案來深入檢索配置文件X水平,而不是以硬編碼方式獲取該配置文件)。 –

+0

@ShlomiBorovitz確切地說,好的說:) –

0

Here's一些方法通過檢查null值LINQ。 但我認爲這可能是一個你需要的(第一個例子從上面的鏈接):

var titleless = items.Where(x => x.Title == null); 
-1

最快的方法來檢查他們的所有,你可以使用嘗試,趕上(NullReferenceException異常)

+0

例外情況用於處理意外情況。如果表達式的預期可能值之一爲空,則拋出異常是不好的解決方案。而且,效率低下,擴張性強。 –

+0

謝謝您發表評論 1)我想用遞歸更多8個水平是非常昂貴的,雖然它是一個聰明的解決方案 2)我想將所有的空檢查到LINQ編譯器特別是如果它是LINQ到黨像SQL或XML將會非常昂貴 3)如果異常僅用於泛型條件,具體異常的用途是什麼,我知道EXCEPTION處理對於這種情況並不是最好的,我們特別明白邏輯,但是你有考慮更清潔,更短,更快的想法 –

+0

遞歸不一定是廣泛的(與尾部呼叫優化)。我不知道什麼是LINQ編譯器,但檢查數據庫中的空值通常會更便宜。我沒有說異常必須是一般的,但是它們應該用於意外情況(例如,在其設計中不支持空值的方法中使用null)。不適用於預期的。 –