使用匿名IEnumerable类型

本文关键字:IEnumerable 类型 | 更新日期: 2023-09-27 18:29:13

这可能是一个简单的问题,但我搞不清楚。。。

如果我有这个代码,

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....
}

使用匿名IEnumerable类型

您不能,因为IEnumerable的枚举器返回类型为object的实例。您首先需要将这些类型强制转换为实际类型。由于类型是匿名的,所以不能这样做。

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

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

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

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

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

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

使用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);
}

非泛型IEnumerableforeach中不是强类型的。

但是由于您想要从方法返回匿名类型,所以这是行不通的。返回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;