C#List <>按x和ysorting

类似于List <> OrderBy按字母sorting,我们要按一个元素sorting,然后再sorting。 我们要达到的function相当于

SELECT * from Table ORDER BY x, y 

我们有一个包含一些sorting函数的类,我们没有一个元素sorting的问题。
例如:

 public class MyClass { public int x; public int y; } List<MyClass> MyList; public void SortList() { MyList.Sort( MySortingFunction ); } 

我们在列表中有以下内容:

 Unsorted Sorted(x) Desired --------- --------- --------- ID xy ID xy ID xy [0] 0 1 [2] 0 2 [0] 0 1 [1] 1 1 [0] 0 1 [2] 0 2 [2] 0 2 [1] 1 1 [1] 1 1 [3] 1 2 [3] 1 2 [3] 1 2 

稳定的sorting是可取的,但不是必需的。 适用于.Net 2.0的解决scheme是受欢迎的。

请记住,如果您比较所有成员,则不需要稳定的sorting。 2.0的解决scheme,按照要求,可以看起来像这样:

  public void SortList() { MyList.Sort(delegate(MyClass a, MyClass b) { int xdiff = axCompareTo(bx); if (xdiff != 0) return xdiff; else return ayCompareTo(by); }); } 

请注意,这个2.0解决scheme比stream行的3.5 Linq解决scheme更受欢迎,它执行就地sorting,并且不具有Linq方法的O(n)存储要求。 除非你更喜欢原始的List对象当然是不变的。

对于.Net版本,您可以使用LINQ OrderByThenBy (或如果需要,则使用ThenByDescending ):

 using System.Linq; .... List<SomeClass>() a; List<SomeClass> b = a.OrderBy(x => xx).ThenBy(x => xy).ToList(); 

注意:对于.Net 2.0(或者如果你不能使用LINQ),请看Hans Passant对这个问题的回答。

你需要实现IComparer接口。 这是一个很好的post,带有示例代码。

诀窍是实现一个稳定的sorting。 我创build了一个可以包含testing数据的Widget类:

 public class Widget : IComparable { int x; int y; public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } public Widget(int argx, int argy) { x = argx; y = argy; } public int CompareTo(object obj) { int result = 1; if (obj != null && obj is Widget) { Widget w = obj as Widget; result = this.X.CompareTo(wX); } return result; } static public int Compare(Widget x, Widget y) { int result = 1; if (x != null && y != null) { result = x.CompareTo(y); } return result; } } 

我实现了IComparable,所以它可以不稳定地按List.Sort()sorting。

不过,我也实现了静态方法Compare,它可以作为委托传递给一个search方法。

我从C#411中借用了这种插入sorting方法:

  public static void InsertionSort<T>(IList<T> list, Comparison<T> comparison) { int count = list.Count; for (int j = 1; j < count; j++) { T key = list[j]; int i = j - 1; for (; i >= 0 && comparison(list[i], key) > 0; i--) { list[i + 1] = list[i]; } list[i + 1] = key; } } 

你可以把它放在你提到的sorting助手类中。

现在,使用它:

  static void Main(string[] args) { List<Widget> widgets = new List<Widget>(); widgets.Add(new Widget(0, 1)); widgets.Add(new Widget(1, 1)); widgets.Add(new Widget(0, 2)); widgets.Add(new Widget(1, 2)); InsertionSort<Widget>(widgets, Widget.Compare); foreach (Widget w in widgets) { Console.WriteLine(wX + ":" + wY); } } 

它输出:

 0:1 0:2 1:1 1:2 Press any key to continue . . . 

这可能可以由一些匿名代表清理,但我会留给你。

编辑 :和NoBugz演示匿名方法的力量…所以,考虑我的更老的学校:P

这可能会帮助你, 如何sortingC#通用列表

我有一个问题,OrderBy和ThenBy没有给我想要的结果(或者我只是不知道如何正确使用它们)。

我去了一个list.Sort解决这样的事情。

  var data = (from o in database.Orders Where o.ClientId.Equals(clientId) select new { OrderId = o.id, OrderDate = o.orderDate, OrderBoolean = (SomeClass.SomeFunction(o.orderBoolean) ? 1 : 0) }); data.Sort((o1, o2) => (o2.OrderBoolean.CompareTo(o1.OrderBoolean) != 0 o2.OrderBoolean.CompareTo(o1.OrderBoolean) : o1.OrderDate.Value.CompareTo(o2.OrderDate.Value)));