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

C# 有没有一种简单的方法可以使用LINQ合并两个有序序列?,c#,linq,C#,Linq,给定 IEnumerable优先; 数秒; 并且first和second都由比较器Func排序,该比较器返回0表示相等,-1表示第一个“较小”,1表示第二个“较小” 是否有一种直接的方法使用LINQ合并两个序列,使生成的序列也由同一个比较器排序? 我们目前使用的是一种手工制作的算法,它可以工作,但是直接LINQ语句的可读性更好。我认为,将第一个可枚举项转换为列表,然后将第二个项添加到此列表,然后调用sort就可以了 IEnumerable<T> first; IEnumerable

给定

IEnumerable优先;
数秒;
并且
first
second
都由比较器
Func
排序,该比较器返回0表示相等,-1表示第一个“较小”,1表示第二个“较小”

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


我们目前使用的是一种手工制作的算法,它可以工作,但是直接LINQ语句的可读性更好。

我认为,将第一个可枚举项转换为列表,然后将第二个项添加到此列表,然后调用sort就可以了

IEnumerable<T> first;
IEnumerable<T> second;
IEnumerable first=new List(){1,3};
IEnumerable second=新列表(){2,4};
var temp=first.ToList();
温度范围(秒);
临时排序(新比较(比较器));//其中comparer是Func

您可以为此定义扩展方法。差不多

        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>
输出:

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));

您是否已将手工算法提取到单独的方法中?这将是提高可读性的最简单方法@geogeduckett:该方法将丢弃重复项(可能不需要)
var tware=first.Concat(second).OrderBy(comparer)可能就是你想要的。@RonWarholic:很好,谢谢。这个实现在额外存储中是O(n),在典型情况下是O(n lgn),在最坏情况下是O(n^2)。有一种算法在额外存储中为O(1),在时间上为O(n)。可以允许参数
比较器
为空(可选参数),并将其设置为
比较器。默认值。如果为空,则比较
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