2011-09-08 149 views

回答

5

您可以通过编写一个稳定的排序扩展方法为List<T>解决这个问题:

public static class ListExtensions 
{ 
    public static void StableSort<T>(this List<T> list, IComparer<T> comparer) 
    { 
     var pairs = list.Select((value, index) => Tuple.Create(value, index)).ToList(); 
     pairs.Sort((x, y) => 
      { 
       int result = comparer.Compare(x.Item1, y.Item1); 
       return result != 0 ? result : x.Item2 - y.Item2; 
      }); 
     list.Clear(); 
     list.AddRange(pairs.Select(key => key.Item1)); 
    } 
} 

,然后在SortableBindingList改变这一行的新版本:

itemsList.Sort(comparer); 

到:

itemsList.StableSort(comparer); 

这可以通过在列表中的项索引上使用不稳定的排序以及辅助键来实现。由于该版本不使用病态缓慢的插入排序来实现稳定的排序,所以它应该足够快以供一般使用。

+0

太棒了,谢谢。 – Jimmy