Jus*_*tin 2 c# generics list anonymous-types
我希望通过在嵌套循环中迭代其他两个列表来构建匿名类型列表。
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
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用ToList(),构造一个匿名类型列表(请参阅此问题),但我不知道如何在上述情况下使用它。
请注意,我无法更改GetAllX和GetAllY方法。
简单的答案是“你不应该”。
有一个哈克技巧,让你做到这一点:
var myList = new[] { new { X = (object) null, Y = (object) null } }.ToList();
myList.Clear();
foreach (object x in GetAllX())
// ...
Run Code Online (Sandbox Code Playgroud)
但按照预期的方式使用它确实更合理:
var myList = GetAllX().Where(x => Process(x))
.SelectMany(x => GetAllY(x).Select(y => new { X = x, Y = y }))
.ToList();
Run Code Online (Sandbox Code Playgroud)
如果由于某种原因你真的不能使用这种纯函数风格,或者你发现你必须在多个地方实例化这样的列表,你可能应该声明一个普通类而不是使用匿名类型。请记住,匿名类型无论如何都会编译到类中,因此匿名类型没有性能优势,如果您不得不求助于本文顶部的技巧,那么即使是可读性/可维护性优势也是值得怀疑的。
有些人建议使用List<dynamic>,但我建议不要使用。它严重妨碍了可维护性,因为在编译时不再检查属性名称和类型(您可能会输入错误并获得运行时错误);它会降低运行时的性能,因为每次访问都要通过动态调度程序;而且,一旦你把你的对象放到这个列表中,你基本上就会坚持它们是动态的,因为你不能将它们转换回匿名类型。
| 归档时间: |
|
| 查看次数: |
2242 次 |
| 最近记录: |