使用动态/自定义排序在LINQ中排序

时间:2015-03-25 16:48:27

标签: c# linq sorting

这是我的方案..我需要按各种字段对对象列表进行排序,我现在拥有的是......

comparisons.OrderBy(c => c.FlexDifference)
            .ThenBy(c => c.ShaftDensityDifference)
            .ThenBy(c => c.TorqueDifference)
            .ThenBy(c => c.LaunchDifference);

但是,现在我需要按照中间的另一个字段sort,sort来排序,这个字段当前只是一个用作枚举的字符串值(不幸的是可能会保持这种状态)。假设此字符串可以是matOnematTwomatThree,这些字符串的排序顺序是动态的(例如,它可能是matTwo,然后是{{1}然后matOne)在三个排序方案之间。我不知道如何处理这个问题 - 我一直在玩像......

matThree

进行此类操作的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

.ThenBy方法有一个重载,它接收keySelector和Comparer。在您的示例中:

var materialComparer = GetMaterialComparer();
comparisons.OrderBy(c => c.FlexDifference)
        .ThenBy(c => c.ShaftDensityDifference)
        .ThenBy(c => c.Material, materialComparer))
        .ThenBy(c => c.TorqueDifference)
        .ThenBy(c => c.LaunchDifference);

materialComparer应该实现IComparer<串GT;

以下是有关如何实施该示例的示例:

Comparer<String> GetMaterialComparer()
{
   if(condition1...)
      return new materialComparer1();
   if(condition2...)
      return new materialComparer2();
   etc...
}

class materialComparer1 : materialComparer
{
    static Dictionary<String, int> specificOrder = new Dictionary<String, int>
                {
                    {"matOne", 2},
                    {"matTwo", 1},
                    {"matThree", 3}
                };

    protected override Dictionary<string, int> order { get { return specificOrder; } }
}

abstract class materialComparer : Comparer<String>
{            
    protected abstract Dictionary<String, int> order{get;}
    public override int Compare(string x, string y)
    {
        return order[x].CompareTo(order[y]);
    }
}

materialComparer2类似于仅定义不同顺序的materialComparer1,

希望这会对你有所帮助,

最好的问候