C#中是否存在非唯一键排序列表generics集合?
我对System.Collections.Generic.SortedList感到有些惊讶
- 它需要我使用
而不是
(比较器)
- 它只允许按值输入
这些在我想要使用它的方式上显得古怪(尽管我确信它们适合其他情况)。 还有另一个没有这两个特征的集合吗?
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);