正在合并2个集合

本文关键字:集合 2个 合并 | 更新日期: 2023-09-27 18:28:30

如何组合两个集合,使生成的集合包含两个集合的值

示例:-列A=[1,2,4]B列=[5,6,7,8]

结果C列=[1,5,2,6,3,7,4,8]

正在合并2个集合

根据输入的类型和所需的输出类型,有很多方法可以做到这一点。然而,据我所知,没有库方法;你必须"自己滚"。

一种可能是linq风格的迭代器方法,假设我们对输入集合的了解只是它们实现了IEnumerable<T>:

static IEnumerable<T> Interleave(this IEnumerable<T> a, IEnumerable<T> b)
{
    bool bEmpty = false;
    using (var enumeratorB b.GetEnumerator())
    {
        foreach (var elementA in a)
        {
            yield return elementA;
            if (!bEmpty && bEnumerator.MoveNext())
                yield return bEnumerator.Current;
            else
                bEmpty = true;
        }
        if (!bEmpty)
            while (bEnumerator.MoveNext())
                yield return bEnumerator.Current;
    }
}
int[] a = { 1, 2, 3, 4 };
int[] b = { 5, 6, 7, 8 };
int[] result = a.SelectMany((n, index) => new[] { n, b[index] }).ToArray();

如果集合a和b的长度不相同,则需要小心使用b[index],可能需要:index >= b.Length ? 0 : b[index]

如果集合的长度不一定相同,请考虑一种扩展方法:

public static IEnumerable<T> AlternateMerge<T>(this IEnumerable<T> source, 
                                               IEnumerable<T> other)
{
    using(var sourceEnumerator = source.GetEnumerator())
    using(var otherEnumerator = other.GetEnumerator())
    {
        bool haveItemsSource = true;
        bool haveItemsOther = true;
        while (haveItemsSource || haveItemsOther)
        {
            haveItemsSource = sourceEnumerator.MoveNext();
            haveItemsOther = otherEnumerator.MoveNext();
            if (haveItemsSource)
                yield return sourceEnumerator.Current;
            if (haveItemsOther)
                yield return otherEnumerator.Current;
        }
    }
}

使用:

List<int> A = new List<int> { 1, 2, 3 };
List<int> B = new List<int> { 5, 6, 7, 8 };
var mergedList = A.AlternateMerge(B).ToList();

假设两个集合的长度相等:

Debug.Assert(a.Count == b.Count);
for (int i = 0; i < a.Count; i++)
{
   c.Add(a[i]);
   c.Add(b[i]);
}
Debug.Assert(c.Count == (a.Count + b.Count));

使用Linq的并集扩展,例如:

var colA = new List<int> { 1, 2, 3, 4 };
var colB = new List<int> { 1, 5, 2, 6, 3, 7, 4, 8};
var result = colA.Union( colB); // 1, 2, 3, 4, 5, 6, 7, 8