有没有一种简单的方法可以使用 LINQ 合并两个有序序列?

2024-01-05

Given

IEnumerable<T> first;
IEnumerable<T> second;

并且两者first and second由比较器排序Func<T, T, int>表示相等则返回 0,当第一个“较小”时返回 -1,当第二个“较小”时返回 1。

是否有一种直接的方法使用 LINQ 来合并两个序列,使结果序列也由同一比较器排序?

我们目前正在使用一种可行的手工算法,但直接的 LINQ 语句的可读性会更好。


您可以为此定义一个扩展方法。就像是

public static IEnumerable<T> MergeSorted<T>(this IEnumerable<T> first, IEnumerable<T> second, Func<T, T, int> comparer) 
{
    using (var firstEnumerator = first.GetEnumerator())
    using (var secondEnumerator = second.GetEnumerator())
    {

        var elementsLeftInFirst = firstEnumerator.MoveNext();
        var elementsLeftInSecond = secondEnumerator.MoveNext();
        while (elementsLeftInFirst || elementsLeftInSecond)
        {
            if (!elementsLeftInFirst)
            {
                    do
                    {
                        yield return secondEnumerator.Current;
                    } while (secondEnumerator.MoveNext());
                    yield break;
            }

            if (!elementsLeftInSecond)
            {
                    do
                    {
                        yield return firstEnumerator.Current;
                    } while (firstEnumerator.MoveNext());
                    yield break;
            }

            if (comparer(firstEnumerator.Current, secondEnumerator.Current) < 0)
            {
                yield return firstEnumerator.Current;
                elementsLeftInFirst = firstEnumerator.MoveNext();
            }
            else
            {
                yield return secondEnumerator.Current;
                elementsLeftInSecond = secondEnumerator.MoveNext();
            }
        }
    }
}

Usage:

var s1 = new[] { 1, 3, 5, 7, 9 };
var s2 = new[] { 2, 4, 6, 6, 6, 8 };

var merged = s1.MergeSorted(s2, (a, b) => a > b ? 1 : -1).ToList();

Console.WriteLine(string.Join(", ", merged));

Output:

1, 2, 3, 4, 5, 6, 6, 6, 7, 8, 9
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有没有一种简单的方法可以使用 LINQ 合并两个有序序列? 的相关文章

随机推荐