查询列表 - 只返回一个值

问题描述:

我创建了一个结构和列表。查询列表 - 只返回一个值

public struct CarMake 
{ 
    public string name; 
    public string id; 

} 

我加了结构对象本(汽车制造商),我试图查询

 string selCar = from c in carMakers 
       where c.name == selectedCarMfgName 
       select c.id; 

我越来越近选择陈述式的错误cannont含蓄的IEnumerable转换为字符串。我知道查询只返回一个值,这就是为什么我喜欢这样。

谢谢!

 carMakers.Add(new CarMake() { name = "Audi", id = "1234" }); 
     string selCar =(from c in carMakers 
         where c.name == "Audi" 
         select c.id).FirstOrDefault(); 

输出 - 1234

string selCar = (from c in carMakers 
        where c.name == selectedCarMfgName 
        select c.id).SingleOrDefault(); 

您的查询返回一个集合(带有一个元素)。您应该使用Single()(或SingleOrDefault())来获取该项目。如果查询可以比一个结果返回更多,你应该看看First()(或FirstOrDefault()

我会稍微修改我的查询:

var selCar = carMakers.Single(c => c.name == selectedCarMfgName).id; 

这是假设你知道汽车是在列表中。如果没有,请使用SingleOrDefault并在获得id之前检查退货。

我没有做太多的LINQ,而是因为你选择成一个字符串,你可能需要使用FirstOrDefault为您的语句可能返回回多个值但是你的字符串只能容纳一个。

首先将返回空值,我觉得如果没有找到,但FirstOrDefault将返回一个空字符串。

,请注意错误消息。它可能说像

"cannot implicitly convert IEnumerable<string> to string." 

序列的查询的结果是另一个序列,IEnumerable<T>您可能知道只有一个结果,但这不是查询所做的。要仅获得一个结果,可以选择在结尾包含另一个扩展方法。

yourQuery.First(); 
yourQuery.FirstOrDefault(); 
yourQuery.Single(); 
yourQuery.SingleOrDefault(); 

在这些不同的是,该变型First*可以与许多元素sequenes工作,而Single*变化将抛出异常,如果一个以上的元素存在。 *OrDefault变体支持匹配元素的概念,并返回该类型的默认值(类为null时为结构体的默认值(例如0代表int))。

使用符合您的期望版本。如果你希望一个只有一个比赛,更喜欢Single。如果你只关心任意多的一个,更喜欢First