带有WHERE的Node类型的LINQ搜索列表

时间:2016-04-27 05:18:53

标签: c# linq

我有一个我设置的点列表:

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时,假设数据类型是什么,有点困惑。

3 个答案:

答案 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。这是因为可能会有多个结果。

如果您只想返回一个项目,请改用SingleFirstLast。如果可能没有匹配项,请使用SingleOrDefaultFirstOrDefaultLastOrDefault

因此,Where返回所有匹配的结果,Single返回唯一匹配的结果,或者如果结果为零或多个则抛出异常,并且SingleOrDefault返回唯一匹配的结果,默认值(null,0,“”等)如果结果为零,或者如果有多个结果则抛出异常。

FirstFirstOrDefaultSingleSingleOrDefault类似,只是如果有多个结果他们不会抛出异常,而是返回第一个匹配值。 LastLastOrDefault完全相同,但最后一个匹配值除外。

因此,假设您知道只有一个匹配的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();`