Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 具有WHERE的节点类型的LINQ搜索列表_C#_Linq - Fatal编程技术网

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
。布鲁诺,如果你需要的话要教任何东西,你必须使它简单。