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'

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

4

7 回答 7

2

尝试

Mk2TestResult result = (Mk2TestResult)query.FirstOrDefault();

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

于 2012-08-14T13:16:50.077 回答
1

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

于 2012-08-14T13:17:31.210 回答
1

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

于 2012-08-14T13:18:46.543 回答
1

您的查询实际上返回您的Enum类型的集合。如果您只想要一个结果,则必须使用SingleSingleOrDefaultFirstFirstOrDefault扩展方法。

注意:当您认为查询可能不返回任何结果时,请使用名为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();
于 2012-08-14T13:19:29.250 回答
0

Linq 返回 IEnumerable,因此您必须遍历它:

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

foreach(var result in query)
  ...
于 2012-08-14T13:17:45.227 回答
0

您返回的 Type 是 Mk2TestResul 的集合,因此您需要将其存储在 List 或 Array 或任何实现 IEnumerable 的东西中。

例子:

List<Mk2TestResult> result = query.ToList();
于 2012-08-14T13:17:57.580 回答
-1

要将新的 Enum 类型添加到 Dynamic linq,您必须添加以下代码:

typeof(Enum),
typeof(T)

T : Enum Type.

到动态的预定义类型属性。

这对我有用

于 2013-03-22T13:15:34.180 回答