List.Sort(自定义排序......)

vin*_*o83 16 c# sorting

我有一个List对象,包括3个项目:Partial,Full To H和Full To O.

我将此列表绑定到asp OptionButtonList,并按字母顺序对其进行排序.但是,我想按如下方式对列表进行排序:

全部到H,部分,全部到O.

我怎么能做到这一点?

Kel*_*sey 25

Linq非常棒.您甚至可以构建订单序列,以便在运行时定义它,因为直到执行排序才执行ToList.

 var sortedList = yourList.OrderBy(i => i.FullToH).
     ThenBy(i => i.Partial).
     ThenBy(i => i.FullToO).ToList();
Run Code Online (Sandbox Code Playgroud)


vin*_*o83 14

谢谢大家的帮助!

我是这样做的:

List<string> sortedList = new List<string>();
sortedList = list.OrderBy(i => i.CodeValue == "FullToH").ThenBy(i => i.CodeValue == "Partial").ThenBy(i => i.CodeValue == "FullToO").ToList();
Run Code Online (Sandbox Code Playgroud)

然后绑定到sortedList!

  • 第一行中的分配是不必要的.这样更好:List <string> sortedList = list.OrderBy ..... (2认同)

jjj*_*jjs 12

好的,我知道这已经有几年了,但我有一个替代解决方案,我认为比未来读者可能想要考虑的上述解决方案更优雅:

在你的班上:

static readonly List<String> codeValueSortOrder = new List<String> {
    "Full To H", 
    "Partial",
    "Full To O"
};
Run Code Online (Sandbox Code Playgroud)

在你的方法中:

sortedList = list.OrderBy(i=> codeValueSortOrder.IndexOf(i.CodeValue));
Run Code Online (Sandbox Code Playgroud)

  • 注意:对于实际代码使用`Dictionary`而不是`codeValueSortOrder`列表来进行O(1)搜索和整体O(n log n)与`Dictionary [value]`而不是O(n ^ 2 log n)与`List .IndexOf` (3认同)

Jar*_*Par 8

您列出的项目(例如FullToHo)是否只是字符串?如果是这样,那么您需要做的就是编写一个方法来进行比较并使用该方法进行排序.

public int CompareEntries(string left, string right) {
  const string fullToH = "Full To H";
  const string partial = "Partial";
  const string fullToO = "Full To O";
  if ( left == right ) {
    return 0;
  } else if ( left == fullToH ) {
    return -1;
  } else if ( left == fullToO ) {
    return 1;
  } else if ( right == fullToH ) {
    return 1;
  } else {
    return -1; 
  }
}

list.Sort(CompareEntries);
Run Code Online (Sandbox Code Playgroud)