C# 将linq查询结果强制转换为枚举
我有一张类似物品的清单。此列表中的对象都有一个名为C# 将linq查询结果强制转换为枚举,c#,linq,enums,linq-to-objects,C#,Linq,Enums,Linq To Objects,我有一张类似物品的清单。此列表中的对象都有一个名为Name的属性和一个名为Mk2Result但属于枚举类型Mk2TestResult的枚举类型 现在,在for循环中,我将查看当前的整数是否作为对象名称存在于列表中: for(...... { // var query = from pin in _pins where pin.Name == i.ToString() select pin.Mk2Result; Mk2
Name
的属性和一个名为Mk2Result
但属于枚举类型Mk2TestResult
的枚举类型
现在,在for循环中,我将查看当前的整数是否作为对象名称存在于列表中:
for(......
{
//
var query =
from pin in _pins
where pin.Name == i.ToString()
select pin.Mk2Result;
Mk2TestResult result = (Mk2TestResult)query;
//Do some more stuff
}
但编译器会发出以下消息:
Cannot convert type 'System.Collections.Generic.IEnumerable<DataModels.Mk2TestResult>' to 'DataModels.Mk2TestResult'
无法将类型“System.Collections.Generic.IEnumerable”转换为“DataModels.Mk2TestResult”
如何将查询结果正确返回为枚举类型?请尝试
Mk2TestResult result = (Mk2TestResult)query.FirstOrDefault();
因为您正试图将列表强制转换为一个对象。
但您将只获得第一个对象。您可以在FirstOrDefault函数参数中使用函数来获取所需的对象。查询的结果是元素的集合,而不是单个元素。这就是编译器想要告诉你们的。如果要从此集合中获取第一个值,则应使用。如果要叠加
Mk2TestResult
,可以使用。或者,您可以简单地遍历集合,并根据具体的Mk2TestResult
值执行一些操作。Linq返回IEnumerable,因此您必须遍历它:
var query =
(from pin in _pins
where pin.Name == i.ToString()
select pin.Mk2Result).ToList();
foreach(var result in query)
...
返回的类型是Mk2TestResul的集合,因此需要将其存储在列表、数组或任何实现IEnumerable的对象中 例如:
List<Mk2TestResult> result = query.ToList();
List result=query.ToList();
您试图将Mk2TestResult对象的集合强制转换为一个对象,因此要么获取FirstOrDefault,要么强制转换为IEnumerable您的查询实际上返回了枚举类型的集合。如果只需要一个结果,则必须使用Single
、SingleOrDefault
、First
或FirstOrDefault
扩展方法
注意:如果您认为查询可能不返回结果,请使用名为或default的方法。当调用Single
或First
时,空结果集将导致异常
var query =
from pin in _pins
where pin.Name == i.ToString()
select pin.Mk2Result;
// If pin.Mk2Result is strongly typed, the cast is not necessary
Mk2TestResult result = query.FirstOrDefault();
要向动态linq添加新的枚举类型,必须添加以下代码:
typeof(Enum),
typeof(T)
T : Enum Type.
指向动态的预定义类型属性
那是我的工作