我有一个类似对象的列表。此列表中的对象都具有名为Name
的属性和名为Mk2Result
但枚举类型为Mk2TestResult
的枚举类型。
现在在for循环中,我想看看当前的itterator整数是否作为对象的名称存在于列表中:
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'
如何正确地将查询结果作为枚举类型返回?
答案 0 :(得分:2)
试
Mk2TestResult result = (Mk2TestResult)query.FirstOrDefault();
因为您正在尝试将列表转换为一个对象。 但是你只会获得第一个对象。您可以在FirstOrDefault函数参数中使用函数来获取所需的对象。
答案 1 :(得分:1)
查询的结果是元素的集合,而不是单个元素。这就是编译器试图说你的。如果您想从此集合中获取第一个值,则应使用Enumerable.First Method。如果您希望重叠Mk2TestResult
,可以使用Enumerable.Aggregate Method。或者您可以简单地遍历集合并根据具体的Mk2TestResult
值执行某些操作。
答案 2 :(得分:1)
您正在尝试将Mk2TestResult对象的集合转换为一个,以便获取FirstOrDefault或强制转换为IEnumerable
答案 3 :(得分:1)
您的查询实际上会返回Enum
类型的集合。如果您只想要一个结果,则必须使用Single
,SingleOrDefault
,First
或FirstOrDefault
扩展方法。
注意:当您认为查询无法返回结果时,请使用名为 OrDefault 的方法。调用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();
答案 4 :(得分:0)
Linq返回IEnumerable,所以你必须遍历它:
var query =
(from pin in _pins
where pin.Name == i.ToString()
select pin.Mk2Result).ToList();
foreach(var result in query)
...
答案 5 :(得分:0)
您要返回的类型是Mk2TestResul的集合,因此您需要将其存储在List或Array或任何实现IEnumerable的内容中。
示例:
List<Mk2TestResult> result = query.ToList();
答案 6 :(得分:-1)
要向动态linq添加新的枚举类型,您必须添加以下代码:
typeof(Enum),
typeof(T)
T : Enum Type.
到dynamic的predefinedTypes属性。
这对我有用