Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 合并具有相同索引的列表?_C#_List - Fatal编程技术网

C# 合并具有相同索引的列表?

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","","",

示例:如果我有如下列表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","","","","","","","","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]);
}