c# - 带有 IEnumerable<T> 键的 LINQ OrderBy

标签 c# linq

我有一个 IEnumerable,我不想在每个序列中排序,而是从序列到序列排序。

new [] {"Z", "B", "C" }
new [] {"A", "B", "C" }
new [] {"B", "B", "C" }

变成了

new [] {"A", "B", "C" }
new [] {"B", "B", "C" }
new [] {"Z", "B", "C" }

是否有现有的 LINQ 方法,或者我是否需要推出自己的 IComparer?

最佳答案

没有内置任何内容。可以很简单地推出自己的辅助方法;它是一行只要序列长度相同

static int SequenceCompare<T>(
    this IEnumerable<T> x, 
    IEnumerable<T> y, 
    Func<T, T, int> comparer) =>
  x.Zip(y, comparer).FirstOrDefault(c => c != 0);

现在,如果您可以比较序列的两个成员,那么您也可以比较两个序列。

如果序列长度不等,则此方法不起作用;你必须做更多的工作才能说“A”,“B”,“C”比“A”,“B”“更大”。

练习:解决不等长序列的问题。 (提示:检查 Zip 的实现并进行相应修改。)

练习:假设我们有一个比较函数Func<T, T, int> 。我们已经了解了如何将其扩展到 Func<IEnumerable<T>, IEnumerable<T>, int> 。现在假设参数是 Task<T> ,或Func<T>Nullable<T>Lazy<T> ——您如何类似地进行比较?哪些是容易的,哪些是困难的,为什么?

关于c# - 带有 IEnumerable<T> 键的 LINQ OrderBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50242189/

相关文章:

c# - 使 IEnumerator 以某种方式返回值的解决方法

c# - 将带有查找的循环展平为单个 linq 表达式

c# - Lambda 表达式中带有 AND 运算符的 Lambda 表达式

c# - 是否可以(以编程方式)证明两个 LINQ 查询相等?

c# - 按 ID 列表排序对象列表

c# - 如何按自定义顺序订购实体列表?

c# - 以编程方式关闭 Excel 中的工作簿

c# - 字符串内容相同但长度不同

c# - HttpContext.Current.Request.UrlReferrer 始终为 null ASP.NET MVC

c# - 如何在不按 F5 的情况下使缓存的图像过期?