将 Linq 查询结果转换为枚举

3

我有一个相似对象的列表。此列表中的所有对象都具有名为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'

如何将查询结果正确地作为枚举类型返回?
7个回答

2
尝试
Mk2TestResult result = (Mk2TestResult)query.FirstOrDefault();

因为您正在尝试将列表转换为一个对象。 但是您只会得到第一个对象。您可以在FirstOrDefault函数参数中使用一个函数来获取所需的对象。

1

你的查询实际上返回了一个你的Enum类型的集合。如果你只想要一个结果,你将需要使用SingleSingleOrDefaultFirstFirstOrDefault扩展方法。

注意:当你认为查询可能不会返回任何结果时,请使用名称带有OrDefault的方法。空结果集在调用SingleFirst时会导致异常。

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();

1
查询结果是一个元素集合,而不是单个元素。这就是编译器试图告诉你的。如果你想从这个集合中获取第一个值,你应该使用Enumerable.First Method。如果你想要Mk2TestResult的叠加,你可以使用Enumerable.Aggregate Method。或者你可以简单地遍历集合,并根据具体的Mk2TestResult值执行一些操作。

1

您正在尝试将Mk2TestResult对象的集合转换为一个对象,因此请获取FirstOrDefault或将其转换为IEnumerable。


0

Linq 返回 IEnumerable,因此您必须通过迭代来处理它:

var query = 
    (from pin in _pins 
    where pin.Name == i.ToString() 
    select pin.Mk2Result).ToList();

foreach(var result in query)
  ...

0

你要返回的类型是Mk2TestResul的集合,因此你需要将它存储在List或Array中,或者任何实现IEnumerable接口的容器中。

例如:

List<Mk2TestResult> result = query.ToList();

-1
要在动态LINQ中添加新的枚举类型,您必须添加以下代码:
typeof(Enum),
typeof(T)

T : Enum Type.

对于 dynamic 的 predefinedTypes 属性来说,这很有效。

这对我很有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接