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

标签 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
            });
        }
    }
}

我知道我可以使用 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/

相关文章:

java - 返回泛型扩展两种类型的工厂方法

c++ - list 和 forward_list 性能之间的区别?

c# web api 使用 auth1.0a 和 OAuthAuthorizationServerProvider

c# - 使用 C# 在多级文件夹结构中查找 Azure 存储容器中的 Blob

c# - Async-await 关键字查询

c# - 保存单个实体而不是整个上下文

java - Java 中泛型类型的树实现

Java 泛型难题 - 获取泛型类型的对象的类/类型,以便稍后确定类型

java - 如何从字符串列表中获取 jsonarray

python - 过滤列表的一部分?