将linq查询结果转换为枚举

时间:2012-08-14 13:15:18

标签: c# linq enums linq-to-objects

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

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

7 个答案:

答案 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类型的集合。如果您只想要一个结果,则必须使用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();

答案 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属性。

这对我有用