我希望构造一个匿名类型列表,该列表是通过在嵌套循环中迭代其他两个列表而构造的。
var myList = new List<???>();
foreach (object x in GetAllX())
{
if (Process(x))
{
foreach (object y in GetAllY(x))
{
myList.Add(new {
X = x,
Y = y
});
}
}
}
我知道我可以使用 ToList()
构造一个匿名类型列表(请参阅 this question ),但我不知道如何在上述情况下使用它。
请注意,我无法更改 GetAllX
和 GetAllY
方法。
最佳答案
简单的答案是“你不应该”。
有一个hacky技巧可以让你做到这一点:
var myList = new[] { new { X = (object) null, Y = (object) null } }.ToList();
myList.Clear();
foreach (object x in GetAllX())
// ...
但是按照预期的方式使用它确实会更合理:
var myList = GetAllX().Where(x => Process(x))
.SelectMany(x => GetAllY(x).Select(y => new { X = x, Y = y }))
.ToList();
如果由于某种原因您确实无法使用这种纯函数样式,或者您发现必须在多个位置实例化这样的列表,那么您可能应该声明一个普通类而不是使用匿名类型。请记住,匿名类型无论如何都会编译成类,因此匿名类型没有性能优势,如果您必须诉诸像本文顶部的 hacky 那样的技巧,那么即使可读性/可维护性优势也是值得怀疑的。
有些人建议使用List<dynamic>
,但我建议不要这样做。它严重妨碍了可维护性,因为在编译时不再检查属性名称和类型(您可能会输入错误并出现运行时错误);它会降低运行时性能,因为每次访问都会经过动态调度程序;而且,一旦您将对象放入此列表中,您基本上就会陷入动态状态,因为您无法将它们转换回匿名类型。
关于c# - 构造匿名类型和嵌套循环的通用列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3473282/