Предположим, у меня есть два результата запроса, которые хранятся в двух разных файлах .csv (1.csv, 2.csv), данные выглядят так:


dim1 и dim2 будут присутствовать в каждом результате таблицы запросов, поля могут быть разными.
Как получить результат, который выглядит следующим образом?

Поля объединяются однозначно в таблице результатов, а строки группируются по ключу (dim1 и dim2)
Я использовал 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"}
};
И я выбрал следующую стратегию:
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);
}
}
Как видите, у меня сложность 2xN ^ 2, и я думаю, что должно быть лучшее решение для генерации нового List<List<string>>
, которое соответствует приведенному выше примеру.