2013-02-15 39 views
0

我有一個IEnumerable集合。 使用LINQ,我從Web服務響應填充集合。 下面是我使用的示例。在選擇使用可空屬性時的LINQ性能

lookupData = from data in content["data"].Children() 
      select new LookupData 
      { 
       LookupKey = (data["data"]["key"]).ToString(), 
       LookupValue = (string)data["data"]["name"] 
      }; 

我將使用相同的代碼進行很多類似的響應,它將返回一個鍵和值。

現在,我得到了一個場景,當我需要從服務響應中爲少數響應(不是所有)提供額外的字段時。所以,我在「LookUpData」類創建的「可選」的屬性和使用如下:

lookupData = from data in content["data"].Children() 
      select new LookupData 
      { 
       LookupKey = (data["data"]["key"]).ToString(), 
       LookupValue = (string)data["data"]["name"], 
       Optional = referenceConfig.Optional != null 
          ? (data["data"]["optional"]).ToString() 
          : String.Empty 
      }; 

這裏的空檢查是一個性能問題。我不想使用下面的內容,因爲我有其他條件,所有它們將會成爲一個非常大的if else循環。

if(referenceConfig.Optional != null){ 

     lookupData = from data in content["data"].Children() 
        select new LookupData 
        { 
         LookupKey = (data["data"]["key"]).ToString(), 
         LookupValue = (string)data["data"]["name"], 
         Optional = (data["data"]["optional"]).ToString() 
        }; 
} 
else{ 
     lookupData = from data in content["data"].Children() 
        select new LookupData 
        { 
         LookupKey = (data["data"]["key"]).ToString(), 
         LookupValue = (string)data["data"]["name"] 
        }; 
} 

但我至少有10個Web服務器響應,每個響應中都有大量數據。

+0

'content [「data」]的類型是什麼?Children()'?如果「可選」不存在,那麼索引器data [「data」] [「optional」]是否會引發異常? – 2013-02-15 12:35:38

+0

'這裏的空檢查是一個性能問題。「真的嗎?如果是這樣,影響有多大,爲什麼? – sgmoore 2013-02-15 14:53:18

回答

0

如果referenceConfig.Optional值可在編譯的時候,你可以做

#if OPTIONAL 

    ... 

    #else 

    ... 

如果沒有 - 你可以實現Null Object Pattern即把所有的["data"][...]屬性總是返回一個值(例如,如果的String.Empty類型是字符串),所以你不會在代碼中明確地檢查。