如何处理空linq查询

时间:2012-02-08 10:59:58

标签: c# 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
   }
}

3 个答案:

答案 0 :(得分:5)

我会用:

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

请注意,此处Select子句正在获取不可为空的小数,但显式将其转换为decimal?,以便您可以区分它们“有结果,但它是0”,“没有任何结果”:

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

或者,您可以使用:

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

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

答案 1 :(得分:2)

使用First()而不是FirstOrDefault(),它将返回null,然后您可以检查它。

答案 2 :(得分:2)

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

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