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