我对System.Collections.Generic.SortedList感到有些惊讶,在那
中<key, value>
代替<value>
(比较器)这些在我想要使用它的方式上显得古怪(虽然我确信它们适合其他情况)。还有另一个没有这两个特征的集合吗?
答案 0 :(得分:7)
SortedList<,>
实际上是按键排序的地图,而不是列表。可能是命名错误。但是有一些方法可以模仿你想要的东西,具体取决于你的具体要求。例如,您可以封装SortedList<T, int>
并添加/删除类似的内容:
// add
int count;
if(list.TryGetValue(value, out count)) list[value] = count+1;
else list[value] = 1;
最终你也可以使用一个简单的列表(List<>
) - 这取决于你在做什么。
在某种程度上,我希望数据绑定等使得很难实现立即排序的常规列表 - 您需要实现接口的 lot 以使其正常工作,正如通常所期望的那样你添加的项目留在最后。
答案 1 :(得分:2)
我不确定这是否符合您的要求。但是你可以对正常的List进行排序。 MSDN谈论它,但显然这需要调用sort。
答案 2 :(得分:1)
我试过找到同样的东西:基本上是一个在你添加项目时保持有序的列表。到目前为止,我发现的最接近的是来自Goletas.Collections的SortedSet,它使用AVL树实现:
http://www.goletas.com/solutions/collections/
但是这个类仍然要求列表中的每个元素都是唯一的(因此“Set”)。
也许可以修改此类以支持非唯一项目。
答案 3 :(得分:1)
我知道这是一个老问题,但我刚刚遇到了另一个问题(C# Sortable collection which allows duplicate keys),它给出了一个解决方案:使用自己的IComparer和SortedSet! 即。
/// <summary>
/// Comparer for comparing two keys, handling equality as being greater
/// Use this Comparer e.g. with SortedSets, SortedLists or SortedDictionaries, that don't allow duplicate keys
/// </summary>
/// <typeparam name="TKey"></typeparam>
public class DuplicateKeyComparer<TKey> : IComparer<TKey> where TKey : IComparable
{
#region IComparer<TKey> 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<T> mySortedValues = new SortedSet<T>(new DuplicateKeyComparer<T>());
编辑:再想一想,对于除SortedSet<T>
以外的任何事情,这可能是一个坏主意,因为您可能无法使用{{1}之外的任何内容查找与重复键相关联的不同值。循环; foreach
可以更好地表示SortedSet<T>
,其中TKey是有趣的值,而TValue是该对象重复数量的计数(例如SortedList<TKey,TValue>
)。
答案 4 :(得分:0)
如果它不是性能关键,您可以使用
1)Linq OrderBy()或
2)列表方法Sort()
参见此示例
var list = new List<int>();
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);