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

特定

IEnumerable first; IEnumerable second; 

并且firstsecond都由比较器Func排序,它返回0表示相等,-1表示第一个为“较小”,1表示第二个为“较小”。

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

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

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

 public static IEnumerable MergeSorted(this IEnumerable first, IEnumerable second, Func 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 

我认为,将第一个可枚举转换为列表并将第二个项目添加到此列表然后调用sort将起到作用。

  IEnumerable first = new List(){1,3}; IEnumerable second = new List(){2,4}; var temp = first.ToList(); temp.AddRange(second); temp.Sort(new Comparison(comparer)); // where comparer is Func