示例:如果我有这样的列表1,2,3:
var list1 = new List<string> {"B", "S", "", "", "", "", ""};
var list2 = new List<string> {"", "", "B", "S", "", "", ""};
var list3 = new List<string> {"", "", "", "", "B", "S", ""};
所以,我发现了另一个问题。我试过了。
getAct.AddRange(a.MatchedALLlist[j].AllNewActionList);
结果是
listAll = { "B","S","","","","","","","","B","S","","","","","","","","B","S","")
但我想合并到一个列表,如。
listAll = { "B","S","B","S","B","S","")
我该怎么办?
答案 0 :(得分:2)
使用扩展方法
public static IEnumerable<string> Merge<T(
this IEnumerable<string> first,
IEnumerable<string> second,
IEnumerable<string> third)
{
using (var eFirst = first.GetEnumerator())
using (var eSecond = second.GetEnumerator())
using (var eThird = third.GetEnumerator())
{
while (eFirst.MoveNext() && eSecond.MoveNext() && eThird.MoveNext())
{
var values = new[] { eFirst.Current, eSecond.Current, eThird.Current };
yield return values.Where(value => string.IsNullOrEmpty(value) == false)
.DefaultIfEmpty("")
.First();
}
}
}
通过使用while
,我们确保合并的时间量等于最小集合中的项目数量。
然后使用它
var merged = list1.Merge(list2, list3);
另一种方法(实际上相同),您可以使用已存在的LINQ扩展函数:
使用FirstNonEmpty
方法(来自@ dasblinkenlight的答案)和Zip
方法
var merge =
list1.Zip(list2, (value1, value2) => FirstNonEmpty(value1, value2))
.Zip(list3, (value, value3) => FirstNonEmpty(value, value3));
答案 1 :(得分:1)
我想您确定所有列表都具有相同的长度,并且每个索引中只有一个列表具有非空元素,因此您可以通过这种方式获得预期结果:
var result = list1.Select((x, i) => x + list2[i] + list3[i]).ToList();
答案 2 :(得分:0)
有时简单的答案是最好的答案。
为什么不使用古老的经典for
循环:
var list1 = new List<string> { "B", "S", "", "", "", "", "" };
var list2 = new List<string> { "", "", "B", "S", "", "", "" };
var list3 = new List<string> { "", "", "", "", "B", "S", "" };
var list4 = new List<string>();
for (int i = 0; i < list1.Count; i++)
{
if (!string.IsNullOrWhiteSpace(list1[i]))
list4.Add(list1[i]);
else if (!string.IsNullOrWhiteSpace(list2[i]))
list4.Add(list2[i]);
else
list4.Add(list3[i]);
}
只要所有3个列表的长度相同,它就应该做你想要的。