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

时间:2017-09-22 00:57:45

标签: 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", ""};

所以,我发现了另一个问题。我试过了。

getAct.AddRange(a.MatchedALLlist[j].AllNewActionList);

结果是

listAll = { "B","S","","","","","","","","B","S","","","","","","","","B","S","")

但我想合并到一个列表,如。

listAll = { "B","S","B","S","B","S","")

我该怎么办?

3 个答案:

答案 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个列表的长度相同,它就应该做你想要的。