C# 合并具有相同索引的列表?
示例:如果我有如下列表1、2、3:C# 合并具有相同索引的列表?,c#,list,C#,List,示例:如果我有如下列表1、2、3: var list1 = new List<string> {"B", "S", "", "", "", "", ""}; var list2 = new List<string> {"", "", "B", "S", "", "", ""}; var list3 = new List<string> {"", "", "", "", "B", "S", ""}; 结果是 listAll = { "B","S","","",
var list1 = new List<string> {"B", "S", "", "", "", "", ""};
var list2 = new List<string> {"", "", "B", "S", "", "", ""};
var list3 = new List<string> {"", "", "", "", "B", "S", ""};
结果是
listAll = { "B","S","","","","","","","","B","S","","","","","","","","B","S","")
但是我想合并到一个列表中,比如
listAll = { "B","S","B","S","B","S","")
我该怎么办?使用扩展方法
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();
}
}
}
另一种方法(实际上是相同的)可以使用已经存在的LINQ扩展函数:使用
FirstNonEmpty
方法(来自@dasblinkenlight的答案)和Zip
方法
var merge =
list1.Zip(list2, (value1, value2) => FirstNonEmpty(value1, value2))
.Zip(list3, (value, value3) => FirstNonEmpty(value, value3));
我假设您确定所有列表都具有相同的长度,并且每个索引中只有一个列表具有非空元素,因此您可以通过以下方式获得预期结果:
var result = list1.Select((x, i) => x + list2[i] + list3[i]).ToList();
有时候一个简单的答案是最好的。 为什么不为循环使用好的经典
:
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]);
}
var list1=新列表{“B”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”、“S”等);
var list2=新列表{“”,“B”,“S”,““”,“”,“”,“”};
var list3=新列表{“”、“”、“”、“”、B、“”、S、“”};
var list4=新列表();
for(int i=0;i
只要这三个列表的长度相同,它就可以做你想做的事情。选择的规则是什么?1) 如果每个列表在同一索引中包含一个字符串,例如,所有列表在第一个索引中包含“B”或“S”,该怎么办?2) 如果列表的长度不一样怎么办?
var result = list1.Select((x, i) => x + list2[i] + list3[i]).ToList();
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]);
}