2012-02-08 50 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; 
}