我创建了一个结构和列表。
public struct CarMake
{
public string name;
public string id;
}
我向此(carMakers)添加了结构对象,并尝试查询
string selCar = from c in carMakers
where c.name == selectedCarMfgName
select c.id;
我在select语句附近收到一个错误 - 很明显将IEnumerable转换为字符串。我知道查询只返回一个值,这就是我喜欢的原因。
谢谢!
答案 0 :(得分:2)
string selCar = (from c in carMakers
where c.name == selectedCarMfgName
select c.id).SingleOrDefault();
您的查询返回一个集合(带有一个元素)。您应该使用Single()
(或SingleOrDefault()
)来获取该项目。如果查询可以返回多个结果,则应该查看First()
(或FirstOrDefault()
)
答案 1 :(得分:1)
注意错误信息。它可能会说类似
"cannot implicitly convert IEnumerable<string> to string."
序列查询的结果是另一个序列,IEnumerable<T>
。 您可能知道您只期望一个结果,但这不是查询的作用。要获得一个结果,您可以选择在最后包含另一个扩展方法。
yourQuery.First();
yourQuery.FirstOrDefault();
yourQuery.Single();
yourQuery.SingleOrDefault();
这些差异在于First*
变体可以与具有多个元素的序列一起使用,而如果存在多个元素,Single*
变体将抛出异常。 *OrDefault
变体支持 no 匹配元素的概念,并返回类型的默认值(类的情况下为null,默认值(例如{{1}的0) })for structs)。
使用符合您期望的版本。如果您希望一个匹配,仅一个匹配,则首选int
。如果您只关心任意一个,请更喜欢Single
。
答案 2 :(得分:0)
我会稍微重构一下我的查询:
var selCar = carMakers.Single(c => c.name == selectedCarMfgName).id;
这假设您知道汽车在列表中。如果没有,请使用SingleOrDefault
并在获取id
之前检查返回。
答案 3 :(得分:0)
我没有用LINQ做太多,但因为你选择了一个字符串,你可能需要使用FirstOrDefault,因为你的语句可以返回多个值,但你的字符串只能容纳一个。
首先会返回null值我认为如果找不到任何内容,但FirstOrDefault会返回一个空白字符串。
答案 4 :(得分:0)
carMakers.Add(new CarMake() { name = "Audi", id = "1234" });
string selCar =(from c in carMakers
where c.name == "Audi"
select c.id).FirstOrDefault();
输出-1234