gpt4 book ai didi

c# - 构造匿名类型和嵌套循环的泛型列表

转载 作者:太空宇宙 更新时间:2023-11-03 20:39:51 25 4
gpt4 key购买 nike

我希望构建一个匿名类型列表,该列表通过在嵌套循环中迭代另外两个列表而构建。

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 ),但我不知道如何在上述情况下使用它。

请注意,我无法更改 GetAllXGetAllY 方法。

最佳答案

简单的回答是“你不应该”。

有一个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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com