C# 具有linq的InvalidCastException错误
下面是我的代码。它返回异常“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
怎么了 错误文本:
无法强制转换类型为的对象 '其中选择列表迭代器'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)
。我知道结果以及它的工作原理,但如果您能一步一步地描述,我将不胜感激。我无法编辑:特别是,为什么这部分好-