c# - 通用 Linq 排序函数?

标签 c# linq lambda

我希望能够传入一个 Func 允许我准确选择如何对项目列表进行排序...我遇到的问题是返回类型可能会有所不同...所以例如我想做这样的事情(不是生产代码):

Func<POline, string> poLineOrder
if (option) poLineOrder = poline => poline.PartNumber;
else poLineOrder = poline => poline.LineOrder;
var orderedLines = poLines.OrderBy(poLineOrder);

这里的问题是,虽然 PartNumber 是一个字符串,但 LineOrder 是一个 int,并且此代码无法编译。我有一种感觉,我将不得不构建一个表达式(?),但我似乎无法获得正确的语法。

(是的,我可以通过使用 poline.LineOrder.ToString("D10") 来解决这个问题,但我在这里问的是更一般的问题……谢谢!)

-主数据库

最佳答案

OrderBy需要类型为 Func<Item, Key> 的键选择器函数和一个可选的 IComparer<Key>定义比较本身。

您需要以下帮助器定义:

 class FunctorComparer<T> : IComparer<T> {
        private readonly Comparison<T> m_Comparison;

        public FunctorComparer(Comparison<T> Comparison) {
            this.m_Comparison = Comparison;
        }

        public int Compare(T x, T y) {
            return m_Comparison(x, y);
        }
    }

    static Comparison<TKey> Compare<TKey, TRes>(Func<TKey, TRes> Selector) where TRes : IComparable<TRes> {
        return (x, y) => Selector(x).CompareTo(Selector(y));
    }

现在你可以写了

Comparison<POLine> x;

if (option) 
   x = Compare<POLine, int>(l => l.PartNumber);
else
   x = Compare<POLine, string>(l => l.LineOrder);

var res = poLines.OrderBy(i => i, new FunctorComparer<POLine>(x));

关于c# - 通用 Linq 排序函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/966344/

相关文章:

c# - 如何将带有某些 xml 类型列的行批量插入数据库?

java - Lambdaj:遍历 Map 并获取值并放入其他 Map

c# - GroupBy then Select 并添加条件记录

c++ - 如何将通用 lambda 传递给函数

lambda - 在Lambda演算中定义堆栈数据结构及其主要操作

c# - 与 .net 中的 Web 服务共享接口(interface)

c# - C# 中的接口(interface)和类

c# - 正则表达式在空格之间查找一个或多个单词

c# - 是否有任何 linqish 方式来保存用户表单数据 - 重构我的代码

linq - RavenDB EmbeddableDocumentStore 中可能存在的错误