查询列表 - 只返回一个值

时间:2011-10-07 14:56:13

标签: linq list

我创建了一个结构和列表。

  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转换为字符串。我知道查询只返回一个值,这就是我喜欢的原因。

谢谢!

5 个答案:

答案 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