查询列表 - 只返回一个值
我创建了一个结构和列表。查询列表 - 只返回一个值
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
。