0

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

如果我有这个代码,

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

2 回答 2

5

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

更改 to 的类型myVarvar使其工作:

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

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

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

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

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

于 2013-08-28T09:10:25.900 回答
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);
}

非泛型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;
于 2013-08-28T09:10:25.290 回答