是否可以使用LINQ将两个或多个相同类型和大小的集合折叠/合并到相同类型和大小的新集合中?
var list01 = new List<string> { "A", "", "", "B", "", "", "" };
var list02 = new List<string> { "", "C", "", "", "", "D", "" };
var list03 = new List<string> { "", "", "", "", "E", "", "" };
The desired result: "A", "C", "", "B", "E", "D", "";
如果一个集合在某个位置保存数据,则其他集合都不会在同一位置保存数据,例如list02和list03中的第一个位置将始终为空,因为list01在第一个位置保持A。
你可能想要两次使用Zip
:
var result = list01
.Zip(list02, (a, b) => !string.IsNullOrEmpty(a) ? a : b)
.Zip(list03, (a, b) => !string.IsNullOrEmpty(a) ? a : b);
Console.WriteLine(string.Join(",", result));
或者另一种解决方案,只需在Zip
中添加项目:
var list = list01.Zip(list02, (a,b) => a + b)
.Zip(list03, (a,b) => a + b);
将string
添加到null
或清空string
会得到相同的结果。
正如其他人所建议的那样,可以使用LINQ的一些内置函数来实现。
以下解决方案没有任何内置功能。
static List<string> megreLists(List<string> lst1, List<string> lst2)
{
List<string> result = new List<string>();
if (lst1.Count == lst2.Count)
{
for (int i = 0; i < lst1.Count; i++)
{
if (string.IsNullOrWhitespace(lst1[i]) && lst1[i].Trim() == lst2[i].Trim())
{
result.Add(lst1[i]);
}
else if (string.IsNullOrWhitespace(lst1[i]) && lst1[i].Trim() != lst2[i].Trim())
{
result.Add(lst1[i]);
}
else if (string.IsNullOrWhitespace(lst2[i]) && lst1[i].Trim() != lst2[i].Trim())
{
result.Add(lst2[i]);
}
}
}
return result;
}
var result = megreLists(megreLists(list01, list02), list03);