Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.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

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# 具有linq的InvalidCastException错误_C#_Linq - Fatal编程技术网

C# 具有linq的InvalidCastException错误

C# 具有linq的InvalidCastException错误,c#,linq,C#,Linq,下面是我的代码。它返回异常“InvalidCastException”。主要问题是——为什么?怎么了 错误文本: 无法强制转换类型为的对象 '其中选择列表迭代器'2[Monopolowy_beta.Gracz,Monopolowy_beta.Gracz]' 要键入“单色β-格拉茨” 而不是gracz=(gracz)docelowy,使用gracz=docelowy.FirstOrDefault()而不是gracz=(gracz)docelowy,使用gracz=docelowy.FirstOrD

下面是我的代码。它返回异常“InvalidCastException”。主要问题是——为什么?
怎么了

错误文本:

无法强制转换类型为的对象 '其中选择列表迭代器'2[Monopolowy_beta.Gracz,Monopolowy_beta.Gracz]' 要键入“单色β-格拉茨”

而不是
gracz=(gracz)docelowy
,使用
gracz=docelowy.FirstOrDefault()

而不是
gracz=(gracz)docelowy
,使用
gracz=docelowy.FirstOrDefault()

让我们检查一下这个查询。它查找满足条件的所有项目(是的,它将返回序列,而不是单个项目),并针对每个此类项目返回。。
listagraczy
list的第二个元素。是的,您没有符合您条件的物品

我认为您应该选择
item
(这是查询的范围变量),并将
FirstOrDefault
应用于结果,因为默认情况下查询将返回
IEnumerable
结果

var docelowy = (from item in listagraczy 
                where (item.czyAktywny == true && item.Id == 3) 
                select item).FirstOrDefault();
使用fluent API编写哪个更好:

var docelowy = listagraczy.FirstOrDefault(item => item.czyAktywny && item.Id == 3);
您还可以在条件中直接使用布尔值(即
item.czyAktywny
而不是
item.czyAktywny==true


经过一点重构后,您的方法应该如下所示

public static Gracz UstawAktywnegoGracza(List<Gracz> listagraczy, int ID)
{ 
   return listagraczy
           .FirstOrDefault(item => item.Id == 3 && (ID != 4 || item.czyAktywny));
}
public static Gracz UstawAktywnegoGracza(List listagraczy,int-ID)
{ 
返回列表
.FirstOrDefault(item=>item.Id==3&&(Id!=4 | | item.czyAktywny));
}
工作原理:

方法中有两个条件块
if(ID==4)
if(ID!=4)
(这实际上是
if…else
。区别在于,在第一种情况下,您是通过另一个条件过滤序列-
项。czyAktywny
应该为true。在第二种情况下,此属性无关紧要。因此,您可以添加一个过滤条件来代替
(ID!=4 | item.czyAktywny)
-czyAktywny只有在ID等于4时才会被验证。此外,您不需要在方法中创建新的
Gracz
对象,因为您无论如何都会从传递的列表中返回一个对象

让我们检查一下这个查询。它查找所有满足条件的项(是的,它将返回序列,而不是单个项),并且对于每个这样的项,它返回..listagraczy
列表的第二个元素。是的,您没有与您的条件匹配的项

我认为您应该选择
item
(这是查询的范围变量),并将
FirstOrDefault
应用于结果,因为默认情况下查询将返回
IEnumerable
结果

var docelowy = (from item in listagraczy 
                where (item.czyAktywny == true && item.Id == 3) 
                select item).FirstOrDefault();
使用fluent API编写哪个更好:

var docelowy = listagraczy.FirstOrDefault(item => item.czyAktywny && item.Id == 3);
您还可以在条件中直接使用布尔值(即
item.czyAktywny
而不是
item.czyAktywny==true


经过一点重构后,您的方法应该如下所示

public static Gracz UstawAktywnegoGracza(List<Gracz> listagraczy, int ID)
{ 
   return listagraczy
           .FirstOrDefault(item => item.Id == 3 && (ID != 4 || item.czyAktywny));
}
public static Gracz UstawAktywnegoGracza(List listagraczy,int-ID)
{ 
返回列表
.FirstOrDefault(item=>item.Id==3&&(Id!=4 | | item.czyAktywny));
}
工作原理:


方法中有两个条件块
if(ID==4)
if(ID!=4)
(这实际上是
if…else
。区别在于,在第一种情况下,您是通过另一个条件过滤序列-
项。czyAktywny
应该为true。在第二种情况下,此属性无关紧要。因此,您可以添加一个过滤条件来代替
(ID!=4 | item.czyAktywny)
-czyAktywny只有在ID等于4时才会被验证。此外,您不需要在方法中创建新的
Gracz
对象,因为您无论如何都会从已传递的列表中返回一个对象。

您的select语句正在返回一个
IEnumerable
。因此,当您试图直接将其强制转换为
Gracz
时,计算机不知道如何执行此操作然后抛出你看到的错误

有很多方法可以处理这种情况,但最简单的方法是简单地将
FirstOrDefault
添加到调用中,从而

gracz = docelowy.FirstOrDefault();

而不是您当前拥有的。顺便说一句,您也需要将此添加到其他
if
语句中-它也有相同的问题。

您的select语句返回一个
IEnumerable
。因此,当您尝试直接将其强制转换到
Gracz
时,计算机不知道如何执行此操作,并抛出错误我在看

有很多方法可以处理这种情况,但最简单的方法是简单地将
FirstOrDefault
添加到调用中,从而

gracz = docelowy.FirstOrDefault();

而不是你现在拥有的。顺便说一句,你也需要把这个添加到你的另一个
if
语句中-它也有同样的问题。

是的,我在回答中提到的那些“方法数”在这里被详细地描述了出来,一行代码比我之前描述的更好。+1,好东西。但是最后一件事-你能请解释我这部分代码的具体操作是什么?
item=>item.Id==3&&(Id!=4 | item.czyAktywny)
。我知道结果和它的工作原理,但如果你能一步一步地描述,我将不胜感激。我无法编辑:尤其是,为什么这部分好-它是如何工作的?
item.Id==3&(Id!=4 | item.czyAktywny)
。&&-它的工作原理类似于“如果没有id=3,那么就转到第二部分”,是吗?或者我想错了?@whoah我添加了一个解释:)
&&&
运算符。只有在第一部分为真的情况下才会检查第二部分。太好了,谢谢!现在一切都清楚了。晚安;-)是的,我在回答中提到的那些“方法的数量”在这里有更详细的说明,一行代码的说明比我要说的要好。+1,好东西。但是最后一件事-你能解释一下这部分代码是怎么做的吗?
item=>item.Id==3&(Id!=4 | | item.czyAktywny)
。我知道结果以及它的工作原理,但如果您能一步一步地描述,我将不胜感激。我无法编辑:特别是,为什么这部分好-