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

时间:2009-11-17 09:54:27

标签: c# collections sortedlist

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

  1. 它要求我使用<key, value>代替<value>(比较器)
  2. 只允许按值输入
  3. 这些在我想要使用它的方式上显得古怪(虽然我确信它们适合其他情况)。还有另一个没有这两个特征的集合吗?

5 个答案:

答案 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);