这可能是一个简单的问题,但我无法弄明白......
如果我有这段代码,
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....
}
答案 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;