C# 使用匿名IEnumerable类型

C# 使用匿名IEnumerable类型,c#,C#,这可能是一个简单的问题,但我无法理解 如果我有这个密码 IEnumerable myVar = (from i in MyList select new { NewText= i.Text, NewValue = i.Value }); 如何在不更改typeIEnumerable的情况下使用myVar中的值 像 编辑: 我的实际代码返回IEnumerable 使用: 非泛型

这可能是一个简单的问题,但我无法理解

如果我有这个密码

IEnumerable myVar = (from i in MyList
          select new 
          {
               NewText= i.Text,
               NewValue = i.Value
          });
如何在不更改typeIEnumerable的情况下使用myVar中的值

编辑:

我的实际代码返回IEnumerable

使用:

非泛型IEnumerable在foreach中不是强类型的

但是,因为您希望从方法返回匿名类型,所以这不起作用。而是返回IEnumerable,例如:

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

    public String Name { get; set; }
    public String Value{ get; set; }
}
现在可以创建IEnumerable并返回:

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

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

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

var myVar = from i in MyList
            select new 
            {
                NewText= i.Text,
                NewValue = i.Value
            };
但是,您的-current invalible-代码中的返回表示LINQ查询实际上位于另一个返回结果的方法中,这就是您希望保持IEnumerable的原因。 在这种情况下,使用匿名类型不是正确的方法,因为它会导致您遇到的问题。 您应该创建一个简单的类,并在查询中使用它,然后将返回类型更改为IEnumerable

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

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

如果我想从函数返回结果,那么我想我不能使用var作为返回类型…不,但你不能返回匿名类型。@Nalaka526:我的答案解决了这个问题。你的猜测是正确的,这是一个返回IEnumerable的方法,添加实际代码作为编辑,并删除原始代码中的“返回”:
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);
}
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> allItems = MyList.Select(i => new Item(i.Text, i.Value))
                                   .ToList();
return allItems;
var myVar = from i in MyList
            select new 
            {
                NewText= i.Text,
                NewValue = i.Value
            };
foreach(dynamic i in myVar)
{
    Console.WriteLine(i.NewValue);
}