当结构不匹配时,在 C# 中组合两个对象列表

Combine two list of object in C# when their structure does not match

我有两个classe

Class One{
   int id;
   string name;   
   int total;
   int val2;
   int level;
}


Class Two{
   int id;
   string name;   
   string parentName;
   int parentId;
   int level;
  }

class 一个包含有关 id、name 和一些数字字段的信息。 另一方面,Class Two 包含 id、names(其中包含与 class One 中相同的数据),但它还包含层次结构信息。例如谁是当前节点的父节点和级别信息(在 class 中可用)

我需要根据 Id 字段合并两个 classes 并生成如下结果:

class Three{
       int id;
       string name;   
       string parentName;
       int parentId;
       int level;
       int total;
       int val2;
  }

在 C# 中获得所需结果的最有效方法是什么。如果列表相同,我们可以使用 Concat 方法。

您可以为此使用 LINQ 的 Join() 方法:

List<One> l1 = .... // your source list of One
List<Two> l2 = .... // your source list of Two

List<Three> =
    l1
        .Join(
            l2,
            x1 => x1.id,
            x2 => x2.id,
            (x1, x2) => new Three
            {
                id = x1.id,
                name = x1.name,
                parentName = x2.parentName,
                parentId = x2.parentName,
                level = x1.level,
                total = x1.total
                val2 = x1.val2
            })
        .ToList();

这会根据相等的 id 组合两个源列表的元素。结果是通过组合 OneTwo 的匹配实例的值创建的 Three 个实例的列表。

我个人发现在进行联接时使用 LINQ 查询语法更容易观察。我改变了 Renè 的答案来做到这一点:

List<One> list1 = ....; // your source list of One
List<Two> list2 = ....; // your source list of Two
List<Three> list3 = (from one in list1
              join two in list2
                  on one.id equals two.id
              select new Three
              {
                  id = one.id,
                  name = one.name,
                  parentName = two.parentName,
                  parentId = two.parentName,
                  level = one.level,
                  total = one.total
                  val2 = one.val2
              }).ToList();