这是我的方案..我需要按各种字段对对象列表进行排序,我现在拥有的是......
comparisons.OrderBy(c => c.FlexDifference)
.ThenBy(c => c.ShaftDensityDifference)
.ThenBy(c => c.TorqueDifference)
.ThenBy(c => c.LaunchDifference);
但是,现在我需要按照中间的另一个字段sort,sort来排序,这个字段当前只是一个用作枚举的字符串值(不幸的是可能会保持这种状态)。假设此字符串可以是matOne
,matTwo
或matThree
,这些字符串的排序顺序是动态的(例如,它可能是matTwo
,然后是{{1}然后matOne
)在三个排序方案之间。我不知道如何处理这个问题 - 我一直在玩像......
matThree
进行此类操作的最佳方法是什么?
答案 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,
希望这会对你有所帮助,
最好的问候