C# 具有WHERE的节点类型的LINQ搜索列表
我有一个点列表,我设置如下:C# 具有WHERE的节点类型的LINQ搜索列表,c#,linq,C#,Linq,我有一个点列表,我设置如下: List<Node> points = new List<Node>(); 这会产生怎样的错误: Cannot implicitly convert type `System.Collections.Generic.IEnumerable<Node>' to `Node' 无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'Node' 所以我猜我误解了它的工作原理,我假设它会
List<Node> points = new List<Node>();
这会产生怎样的错误:
Cannot implicitly convert type `System.Collections.Generic.IEnumerable<Node>' to `Node'
无法将类型'System.Collections.Generic.IEnumerable'隐式转换为'Node'
所以我猜我误解了它的工作原理,我假设它会返回它找到的列表中的节点,或者干脆为null
在列表中使用
Where
时,它应该是什么数据类型?我有点困惑。扩展方法Where
将返回多个项目:IEnumerable
如果您希望基于筛选得到一个项目,则可以使用:
Node T = points.FirstOrDefault(v => v.x == position[0] && v.y == position[1]);
如果未找到筛选器的节点,则将返回default(Node)
(即:如果节点是类,则返回null
)
您还可以使用其他扩展方法,如:
First(), Single(), SingleOrDefault()
将为您提供有关其特性的详细信息。扩展方法
Where
将返回多个项目:IEnumerable
如果您希望基于筛选得到一个项目,则可以使用:
Node T = points.FirstOrDefault(v => v.x == position[0] && v.y == position[1]);
如果未找到筛选器的节点,则将返回default(Node)
(即:如果节点是类,则返回null
)
您还可以使用其他扩展方法,如:
First(), Single(), SingleOrDefault()
将为您提供有关其特性的详细信息。
其中
返回IEnumerable
而不是节点
。这是因为可能有不止一个结果
如果只想返回单个项目,请改用single
、First
或Last
。如果可能没有匹配项,请使用SingleOrDefault
、FirstOrDefault
或lastorefault
因此,其中
返回所有匹配结果,Single
返回唯一匹配结果,如果有零个或多个结果,则引发异常,SingleOrDefault
返回唯一匹配结果,如果结果为零,则返回默认值(null
,0,“”,等等),如果有多个结果,则引发异常
First
和FirstOrDefault
与Single
和SingleOrDefault
类似,只是如果有多个结果,它们不会抛出异常,而是返回第一个匹配值Last
和LastOrDefault
的工作原理完全相同,但最后的匹配值除外
因此,假设您知道只有一个匹配的节点
,您可以这样做:
Node T = points.Single(v => v.x == position[0] && v.y == position[1]);
其中
返回IEnumerable
非节点
。这是因为可能有不止一个结果
如果只想返回单个项目,请改用single
、First
或Last
。如果可能没有匹配项,请使用SingleOrDefault
、FirstOrDefault
或lastorefault
因此,其中
返回所有匹配结果,Single
返回唯一匹配结果,如果有零个或多个结果,则引发异常,SingleOrDefault
返回唯一匹配结果,如果结果为零,则返回默认值(null
,0,“”,等等),如果有多个结果,则引发异常
First
和FirstOrDefault
与Single
和SingleOrDefault
类似,只是如果有多个结果,它们不会抛出异常,而是返回第一个匹配值Last
和LastOrDefault
的工作原理完全相同,但最后的匹配值除外
因此,假设您知道只有一个匹配的节点
,您可以这样做:
Node T = points.Single(v => v.x == position[0] && v.y == position[1]);
。其中
返回与您的条件匹配的所有点。
相反,你只需要一点。
使用FirstOrDefault
仅检索一个结果
试试这个:
Node T = points.Where(v => v.x == position[0] && v.y == position[1]).FirstOrDefault();`
。其中
返回与您的条件匹配的所有点。
相反,你只需要一点。
使用FirstOrDefault
仅检索一个结果
试试这个:
Node T = points.Where(v => v.x == position[0] && v.y == position[1]).FirstOrDefault();`
那么,如果它找到多个,那么处理它的最佳方法是什么呢?如果你只想要第一个(不管返回了多少),如果没有找到,你就不想抛出。使用FirstOrDefault()。如果只使用First(),则在未找到任何异常时将引发异常。就我个人而言,我总是使用FirstOrDefault,然后我会检查自己是否找到了一个项(例如:if(node==null),这样我就可以抛出一个更友好的异常(一个节点的Y和X值除外),所以如果它找到多个异常,最好的处理方法是什么?如果你只想要第一个(不管返回多少个),如果未找到,则不希望抛出。请使用FirstOrDefault()。如果仅使用First(),则在未找到时将抛出异常。就我个人而言,我始终使用FirstOrDefault,然后我检查自己是否找到项(例如:if(node==null),以便抛出更友好的异常(Y和X值除外的一个节点)没有理由调用
Where
然后调用FirstOrDefault
。你可以直接使用FirstOrDefault
。布鲁诺,如果你需要教任何东西,你必须让它变得简单。没有理由调用Where
然后调用FirstOrDefault
。你可以直接使用FirstOrDefault
。布鲁诺,如果你需要的话要教任何东西,你必须使它简单。