使用匿名IEnumerable类型

时间:2013-08-28 09:08:48

标签: c#

这可能是一个简单的问题,但我无法弄明白......

如果我有这段代码,

IEnumerable myVar = (from i in MyList
          select new 
          {
               NewText= i.Text,
               NewValue = i.Value
          });

如何在myVar中使用值(不更改类型(IEnumerable))?

喜欢

foreach (var i in myVar)
{
    //i....
}

编辑:

我的实际代码返回IEnumerable

public IEnumerable GetData(IEnumerable<int> priceDetailId)
{
   ....

   return (from i in MyList
              select new 
              {
                   NewText= i.Text,
                   NewValue = i.Value
              });
}

然后我需要在循环中使用结果..

var result  = GetData();
foreach (var i in result)
{
    //i....
}

2 个答案:

答案 0 :(得分:5)

您不能,因为IEnumerable的枚举器返回类型为object的实例。您首先需要将它们转换为实际类型。由于该类型是匿名的,因此您不能这样做。

myVar的类型更改为var以使其正常工作:

var myVar = from i in MyList
            select new 
            {
                NewText= i.Text,
                NewValue = i.Value
            };

但是,您当前非法代码中的return表示LINQ查询实际上位于另一个返回结果的方法内,这就是您要保留IEnumerable的原因。 /> 在这种情况下,使用匿名类型不是正确的方法,因为它会导致您遇到的确切问题 您应该创建一个简单的类并在查询中使用它,并将返回类型更改为IEnumerable<YourClass>

最后,如果您坚持使用匿名类型IEnumerable,则可以在dynamic循环中使用foreach关键字:

foreach(dynamic i in myVar)
{
    Console.WriteLine(i.NewValue);
}

但是,您不再具有编译时安全性,因此如果在访问动态变量时出现拼写错误,则会出现运行时异常而不是编译器错误。
示例:虽然匿名类型中没有Console.WriteLine(i.Foo);属性,但Foo会编译。然而,在执行时,它将抛出RuntimeBinderException

答案 1 :(得分:2)

使用var

var myVar = from i in MyList
            select new 
            {
                Text= i.Text,
                Value = i.Value
            });

foreach(var x in myVar)
{
    Console.WriteLine("Text={0} Value={1}", x.Text, x.Value);
}

非通用IEnumerable未在foreach中强列入。

但是既然你想从方法中返回匿名类型,那就不行了。请改为IEnumerable<CustomClass>,例如:

public class Item
{
    public Item(string text, string value) 
    {
        Name = name;
        Value = value;
    }

    public String Name { get; set; }
    public String Value{ get; set; }
}

现在您可以创建一个IEnumerable<Item>并将其返回:

IEnumerable<Item> allItems = MyList.Select(i => new Item(i.Text, i.Value))
                                   .ToList();
return allItems;