使用匿名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
的枚举器返回类型为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);
}
非泛型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;