linq迭代需要单行吗?

Rus*_*ana 3 linq

当我形成以下代码

Rabbit[] rbt=
new Rabbit[]
{
   new Rabbit{ Name="Jobby", Vegetable=new Vegetable{ VegiName="carrot"}},
   new Rabbit{ Name="hobby", Vegetable=new Vegetable{ VegiName="Beetroot"}}
};

var s = from bt in rbt where
        bt.Vegetable.VegiName.CompareTo("carrot") == 0 select bt;

foreach (var v in s)
{
                Console.WriteLine("{0}{1}",v.Vegetable.VegiName,v.Name);
}
Run Code Online (Sandbox Code Playgroud)

我的查询只返回单行,那为什么我需要foreach迭代?我不能用

Console.WriteLine("{0}{1}",s.Vegetable.VegiName,s.Name); directly ?
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 8

编译器如何知道您的查询只返回一行?假设您更改了数据以包含另一个胡萝卜 - 或者根本没有胡萝卜 - 您期望发生什么.

如果你肯定得到一个结果,请打电话Single来获得它.如果您可能获得多个结果,请致电First.如果您可能获得多个结果或没有结果,请致电FirstOrDefault.如果您可能得到零或一个结果,请致电SingleOrDefault.例如,对于第一种情况:

var s = from bt in rbt where
        bt.Vegetable.VegiName.CompareTo("carrot") == 0 select bt;

var veg = s.Single();

Console.WriteLine("{0}{1}",veg.Vegetable.VegiName,veg.Name);
Run Code Online (Sandbox Code Playgroud)

或者:

var veg = rbt.Where(bt => bt.Vegetable.VegiName.CompareTo("carrot") == 0)
             .Single();
Console.WriteLine("{0}{1}",veg.Vegetable.VegiName,veg.Name);
Run Code Online (Sandbox Code Playgroud)