LINQ OrderBy使用IEnumerable <t>键

时间:2018-05-08 21:00:03

标签: 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?

1 个答案:

答案 0 :(得分:5)

内置任何内容。滚动自己的帮助方法很简单;如果序列长度相同,则为一行。

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> - 您如何同样实施比较?哪一个很容易,哪个很难,为什么?