C# 有没有办法将不同的键选择器返回给一个OrderBy?

C# 有没有办法将不同的键选择器返回给一个OrderBy?,c#,linq,lambda,C#,Linq,Lambda,我排了很长的队,里面有一个勤务员。这条线重复了几次,只有一个微小的差别: OrderBy(m => m.Name) OrderBy(m => m.CreationTime) 等等 出于可维护性的考虑,是否有办法只生成一行,让它调用一些方法,或者使用一些操作来返回正确的字段?问题是这些字段的类型不同 看看这个方法签名: 公共静态可减数OrderBy 这是一个数不清的来源, Func键选择器, IComparer比较器 你需要给它一个IComparer 不确定仅仅为了排序而创建类是否

我排了很长的队,里面有一个勤务员。这条线重复了几次,只有一个微小的差别:

OrderBy(m => m.Name)
OrderBy(m => m.CreationTime)
等等


出于可维护性的考虑,是否有办法只生成一行,让它调用一些方法,或者使用一些操作来返回正确的字段?问题是这些字段的类型不同

看看这个方法签名:

公共静态可减数OrderBy 这是一个数不清的来源, Func键选择器, IComparer比较器

你需要给它一个IComparer

不确定仅仅为了排序而创建类是否更干净

您还可以创建不同的方法,根据作为参数获取的枚举对列表进行排序, 我认为这是一个更干净的解决方案


听起来像是在多次复制同一个选择?你只需要这个:

.OrderBy(m=>m.Name)
.ThenBy(m=>m.CreationTime);
在OrderBy之后,您必须使用ThenBy

但这并不能回答你的问题。在m类型中实现IComparable,然后可以与

.OrderBy(m => m)
还是像这样

.OrderBy(m => m, MyClass.NameComparer)
.OrderBy(m => m, MyClass.DateComparer)
.OrderBy(m => m.GetKey(1))

也许这更接近你想要的

public IComparable GetKey(int keyNum)
{
    switch (keyNum) {
        case 1:
            return Name;
        case 2:
            return CreationTime;
        default:
            return null;
    }
}
排序将像这样进行

.OrderBy(m => m, MyClass.NameComparer)
.OrderBy(m => m, MyClass.DateComparer)
.OrderBy(m => m.GetKey(1))
另一种方法是返回一个委托

public static Func<MyClass, IComparable> GetKeySelector(int keyNum)
{
    switch (keyNum) {
        case 1:
            return m => m.Name;
        case 2:
            return m => m.CreationTime;
        default:
            throw new ArgumentException();
    }
}

.OrderBy(MyClass.GetKeySelector(1));

它是名称或CreationTimeHanks。但是不,行在不同的方法中,要么调用一个,要么调用另一个。我只想创建一个方法,然后调用第二个方法,返回第一个方法的键,它是Name或CreationTimeThanks。但是不,行在不同的方法中,要么调用一个,要么调用另一个。我只想创建一个方法,然后调用第二个方法,返回第一个方法的键。@ispiro。您还可以创建不同的方法,根据作为参数获得的枚举对列表进行排序,这看起来是一个更好的解决方案。谢谢。这正是我想要做的,但只有IComparer用这种方法准备好了。@ispiro。每个方法都会对硬编码的列表进行一次排序。然后使用这些方法对列表进行排序。对不起,在那里找不到您。到目前为止,我有:委托字符串FieldInfoToStringFieldInfo f;IComparer ic=新字段信息字符串;我走的方向对吗?如何创建您提到的FooComparer?@ispiro。我相信那种完全的抽象是不可能的,或者说是极其困难的。我试过你的第一个建议,但似乎无法付诸实施。请参见问题的编辑。你知道为什么吗?好的。我让VS接受它:GetKeyf,1。我知道,我必须检查一下它是否有效。很有效。非常感谢您抽出时间!值得多次向上投票。我的GetKey是MyClass中的一个方法,因此我不需要第一个参数。请注意,我的第二个解决方案不需要此参数,因为构建委托不需要具体实例。
public static Func<MyClass, IComparable> GetKeySelector(int keyNum)
{
    switch (keyNum) {
        case 1:
            return m => m.Name;
        case 2:
            return m => m.CreationTime;
        default:
            throw new ArgumentException();
    }
}

.OrderBy(MyClass.GetKeySelector(1));