2012-02-08 107 views
2

我敢肯定有寫下面的一個更好的辦法很樂意就如何最好地去了解它如何處理空LINQ查詢

幾個指針基本上我不能保證項目的清單包含特定項目我後,並試圖返回一個基於上述項目的價值。

class item 
{ 
string Brand; 
string Product; 
decimal Value; 
} 

//List is created and filled elsewhere 
List<item> _items; 

void DoStuff() 
{ 
decimal desiredValue = 0; 

    try 
    { 
    var XXX = _items 
      .Where(x=>x.Brand == "brand1") 
      .Where(x=>x.Product == "product1") 
      .First(); 

    desiredValue = XXX.Value; 
    } 
    catch() 
    { 
    //Empty Catch Bugs me 
    } 
//Do something with desiredValue 
    } 
} 
+0

順便說一句,正如沒有人指出的那樣,您使用了單個'=',而c#使用'=='來實現相等性。也許只是你的問題中一個錯字,但認爲ID指出來以防萬一;) – Jamiec 2012-02-08 11:05:40

+0

耶只是一個錯字我會解決的感謝 – RoughPlace 2012-02-08 11:10:26

回答

5

我會用:

decimal? result = _items.Where(x => x.Brand == "brand1") 
         .Where(x => x.Product == "product1") 
         .Select(x => (decimal?) x.Value) 
         .FirstOrDefault(); 

請注意,這裏的Select子句獲取應該說這是非空的小數,但明確地將其轉換爲decimal?,這樣你就可以告訴

if (result == null) 
{ 
    // No results 
} 
else 
{ 
    decimal realResult = result.Value; 
    // whatever... 
} 

:「有一個結果,但它是0」和「沒有發現任何結果」之間的區別或者,您可以使用:

Item result = _items.FirstOrDefault(x => x.Brand == "brand1" && 
             x.Product == "product1"); 

if (result == null) 
{ 
    // No results 
} 
else 
{ 
    decimal value = result.Value; 
    // Proceed... 
} 
+0

我那麼遠,在允許您在所需的默認,如果通過一個擴展包FirstOrDefault去默認不是你想要的。 – Massif 2012-02-08 13:54:34

2

相反的First(),使用FirstOrDefault(),這將返回null,然後你就可以檢查。

2
var result= _items.Where(x=>x.Brand = "brand1" && x.Product="product1").FirstOrDefault() 

if (result!=null) 
{ 
    // get the first 
    var firstItem = result.value; 
}