如何将多个表数据结构合并为一个表结果结构?

Ovy*_*ate 5 .net c# dictionary list

假设我有两个查询结果存储在两个不同的.csv文件(1.csv,2.csv)中,数据如下所示:

  • 1.csv:

在此处输入图片说明

  • 2.csv

在此处输入图片说明

dim1和dim2将出现在每个查询表结果中,这些字段可以不同。

我如何获得如下所示的结果?

  • 结果

在此处输入图片说明

这些字段在结果表中是唯一连接的,并且行通过键(dim1和dim2)分组。

我用a List<List<string>>来代表每个表的结果:

public static List<List<string>> R1 { get; } = new List<List<string>>
    {
        new List<string> {"dim1", "dim2", "field1"},
        new List<string> {"2", "wwa", "3"},
        new List<string> {"1", "arr", "6"}
    };

    public static List<List<string>> R2 { get; } = new List<List<string>>
    {
        new List<string> {"dim1", "dim2", "field2", "field3"},
        new List<string> {"2", "jaja", "1000", "2"},
        new List<string> {"3", "wwa", "1000", "3"},
        new List<string> {"1", "arr", "2000", "4"}
    };
Run Code Online (Sandbox Code Playgroud)

我采用了以下策略:

var keys = 2;
        var results = new List<List<string>>();

        foreach (var r1 in R1)
        {
            var range = r1.GetRange(0, keys);
            var hash = range.GetKey();
            var found = false;

            var row = new List<string>();
            foreach (var r2 in R2)
            {
                if (r2.GetRange(0, keys).GetKey() == hash)
                {
                    row.AddRange(range);
                    row.AddRange(r1.GetRange(keys, r1.Count - keys));
                    row.AddRange(r2.GetRange(keys, r2.Count - keys));
                    results.Add(row);
                    found = true;
                }
            }
            if (!found)
            {
                row.AddRange(r1);
                R2[0].GetRange(keys, R2[0].Count - keys).ForEach(e => row.Add(null));
                results.Add(row);
            }
        }

        foreach (var r2 in R2)
        {
            var range = r2.GetRange(0, keys);
            var hash = range.GetKey();
            var found = false;

            var row = new List<string>();
            foreach (var r in results)
            {
                if (r.GetRange(0, keys).GetKey() == hash)
                    found = true;
            }
            if (!found)
            {
                row.AddRange(range);
                R1[0].GetRange(keys, R1[0].Count - keys).ForEach(e => row.Add(null));
                row.AddRange(r2.GetRange(keys, r2.Count - keys));
                results.Add(row);
            }
        }
Run Code Online (Sandbox Code Playgroud)

如您所见,我具有2xN ^ 2的复杂度,我认为应该有一个更好的方法来生成List<List<string>>适合上面示例的新方法。