鉴于
IEnumerable<T> first;
IEnumerable<T> second;
并且first
和second
都由比较器Func<T, T, int>
排序,对于相等性返回0,当第一个为“较小”时返回-1,当第二个为“较小”时返回1 ”
是否有一种直接的方式使用LINQ来合并两个序列,使得结果序列也由相同的比较器排序?
我们目前正在使用手工制作的算法,但是直接LINQ语句的可读性会更好。
答案 0 :(得分:12)
您可以为此定义扩展方法。像
这样的东西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();
}
}
}
}
用法:
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));
输出:
1, 2, 3, 4, 5, 6, 6, 6, 7, 8, 9
答案 1 :(得分:0)
我认为,将第一个nienumerable转换为list并将第二个项目添加到此列表然后调用sort将会起到作用。
IEnumerable<int> first = new List<int>(){1,3};
IEnumerable<int> second = new List<int>(){2,4};
var temp = first.ToList();
temp.AddRange(second);
temp.Sort(new Comparison<int>(comparer)); // where comparer is Func<T,T,int>