我希望能够传入一个 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/