我需要为Tuple实现Comparison
委托。我有一个列号,我想用它来比较元组。
现在我得:
int sortedColumn;
Comparison<Tuple<T1, T2, T3>> tupleComparison = (x, y) =>
{
// I want to access x.Item2 if sortedColumn = 2
// x.Item3 if sortedColumn = 2 etc
};
我怎样才能在c#中这样做?
我可以不使用switch
吗?
答案 0 :(得分:2)
我可能会选择if
/ else
或switch
,但如果您想避免这种情况(例如,您可以将它与任何Tuple
一起使用),你可以使用反射:
Comparison<Tuple<T1, T2, T3>> tupleComparison = (x, y) =>
{
var prop = typeof(Tuple<T1, T2, T3>).GetProperty("Item" + sortedColumn);
var xItem = prop.GetValue(x);
var yItem = prop.GetValue(y);
return // something to compare xItem and yItem
};
答案 1 :(得分:0)
一个鲜为人知的事实是,所有元组都实现了稍微模糊的接口ITuple
。该接口定义了两种方法(Length
返回元组中的项目数,以及索引访问方法[]
-从零开始),但是这两种方法都是隐藏的,这意味着您拥有将元组变量显式转换为已实现的接口,然后使用相关方法。
请注意,由于索引访问方法始终返回object
,因此必须最终将访问的项目转换为其固有类型。
Comparison<Tuple<T1, T2, T3>> tupleComparison = (x, y) =>
{
var columnValue = (int)((ITuple)x)[sortedColumn]; // Don't forget to cast to relevant type
};