C#中是否存在非唯一键排序列表generics集合?

我对System.Collections.Generic.SortedList感到有些惊讶

  1. 它需要我使用而不是 (比较器)
  2. 它只允许按值输入

这些在我想要使用它的方式上显得古怪(尽管我确信它们适合其他情况)。 还有另一个没有这两个特征的集合吗?

SortedList<,>实际上是按键排序的地图,而不是列表。 可能是错误的命名。 但是有一些方法可以模仿你想要的东西,具体取决于你的具体要求。 例如,您可以封装SortedList并添加/删除类似的内容:

 // add int count; if(list.TryGetValue(value, out count)) list[value] = count+1; else list[value] = 1; 

最终你也可以使用一个简单的列表( List<> ) – 这取决于你在做什么。

在某种程度上,我希望数据绑定等使得很难实现立即排序的常规列表 – 您需要实现许多接口才能使其正常工作,因为通常它会期望您添加的项目保持在最后。

我不确定这是否符合您的要求。 但是您可以对正常的List进行排序。 MSDN谈论它,但显然这需要调用sort。

我试过找到同样的东西:基本上是一个在你添加项目时保持有序的列表。 到目前为止,我发现的最接近的是来自Goletas.Collections的SortedSet,它使用AVL树实现:

http://www.goletas.com/solutions/collections/

但是这个类仍然要求列表中的每个元素都是唯一的(因此“Set”)。

也许可以修改此类以支持非唯一项。

我知道这是一个老问题,但我刚刚遇到了另一个问题( 允许重复键的C#Sortable集合 ),它提供了一个解决方案:使用自己的IComparer和SortedSet! 即

 ///  /// Comparer for comparing two keys, handling equality as being greater /// Use this Comparer eg with SortedSets, SortedLists or SortedDictionaries, that don't allow duplicate keys ///  ///  public class DuplicateKeyComparer : IComparer where TKey : IComparable { #region IComparer Members public int Compare(TKey x, TKey y) { int result = x.CompareTo(y); return result == 0 ? 1 : result; // Handle equality as being greater } #endregion } 

用法:

 SortedSet mySortedValues = new SortedSet(new DuplicateKeyComparer()); 

编辑:再想一想,除了SortedSet之外,这可能是一个坏主意,因为你可能无法使用foreach循环之外的任何东西查找与重复键相关的不同值。 SortedSet将更好地由SortedList ,其中TKey是有趣的值,TValue是该对象的重复数量的计数(例如int )。

如果它不是性能关键,您可以使用其中任何一个

1)Linq OrderBy()

2)列表方法Sort()

看这个例子

  var list = new List(); list.Add( 2); list.Add( 1); list.Add( 3); Console.WriteLine("Using Linq OrderBy"); foreach (int i in list.OrderBy(i=>i)) Console.WriteLine(i); Console.WriteLine("Using List.Sort()"); list.Sort(); foreach (int i in list) Console.WriteLine(i);