我有一个我设置的点列表:
List<Node> points = new List<Node>();
我刚开始使用LINQ根据搜索参数在列表中查找特定项目,如下所示:
Node T = points.Where(v => v.x == position[0] && v.y == position[1]);
这怎么会给出错误:
Cannot implicitly convert type `System.Collections.Generic.IEnumerable<Node>' to `Node'
所以我想我误解了它是如何工作的,我假设它会返回它找到的列表中的Node或者只是null。
在列表中使用Where
时,假设数据类型是什么,有点困惑。
答案 0 :(得分:2)
扩展方法Where
将返回多个项目:IEnumerable<Node>
如果您希望根据过滤器使用一个项目,则可以使用:
Node T = points.FirstOrDefault(v => v.x == position[0] && v.y == position[1]);
如果没有为您的过滤器找到节点,则会返回default(Node)
(如果Node是班级,则为null
)
您可以使用其他扩展方法,例如:
First(), Single(), SingleOrDefault()
This link会为您提供有关其特征的详细信息。
答案 1 :(得分:2)
Where
返回IEnumerable<Node>
而不是Node
。这是因为可能会有多个结果。
如果您只想返回一个项目,请改用Single
,First
或Last
。如果可能没有匹配项,请使用SingleOrDefault
,FirstOrDefault
或LastOrDefault
。
因此,Where
返回所有匹配的结果,Single
返回唯一匹配的结果,或者如果结果为零或多个则抛出异常,并且SingleOrDefault
返回唯一匹配的结果,默认值(null
,0,“”等)如果结果为零,或者如果有多个结果则抛出异常。
First
和FirstOrDefault
与Single
和SingleOrDefault
类似,只是如果有多个结果他们不会抛出异常,而是返回第一个匹配值。 Last
和LastOrDefault
完全相同,但最后一个匹配值除外。
因此,假设您知道只有一个匹配的Node
,您可以这样做:
Node T = points.Single(v => v.x == position[0] && v.y == position[1]);
答案 2 :(得分:2)
.Where
返回符合条件的所有积分。
相反,你只需要一点。
使用FirstOrDefault
仅检索一个结果。
试试这个:
Node T = points.Where(v => v.x == position[0] && v.y == position[1]).FirstOrDefault();`