c#dictionary <string,string>按键排序asc空值结尾

时间:2015-08-10 21:00:02

标签: c# dictionary

我有Dictionary<string,string>,其中包含键和值。

有一个键为空/空。

如何按字母顺序按键排序,并在底部/末尾添加空键?

2 个答案:

答案 0 :(得分:3)

您可以将SortedDictionary与自定义Comparer一起使用。并相应地排序。

但是就像一般建议:如果 排序对你很重要,那么词典通常 适合处理这种要求的数据结构。

答案 1 :(得分:0)

Dictionary<TKey,TValue>没有订单。它的后备存储是哈希表。如果要对其强制执行订单,请使用SortedDictionary<TKey,TValue>:其后备存储是红黑树(高度平衡二叉树)。

你应该记住,在内存使用,插入/删除/查找的成本方面存在权衡问题。

您可能还需要提供合适的比较器来强加您所需的订单。

如果你需要一个比较null-high的比较器(大多数内置的是null-low),那么这样就足够了:

public class MyCustomStringComparer : IComparer<string>
{
    private readonly StringComparer    baseComparer    ;
    private readonly StringComparison? comparisonStyle ;
    public MyCustomStringComparer( StringComparer baseComparer ) : this( baseComparer , null )
    {
    }
    public MyCustomStringComparer( StringComparison comparisonStyle ) : this( null , comparisonStyle )
    {
    }
    public MyCustomStringComparer() : this( null , null )
    {
    }
    private MyCustomStringComparer( StringComparer comparer , StringComparison? style )
    {
        this.baseComparer = comparer ;
        this.comparisonStyle = style ;
    }
    public int Compare( string x , string y )
    {
        if      ( x == null && y == null ) return  0 ; // two nulls are equal
        else if ( x == null && y != null ) return +1 ; // null is greater than non-null
        else if ( x != null && y == null ) return -1 ; // non-null is less than null
        else // ( x != null && y != null ) ;
        {
            if      ( baseComparer    != null ) return baseComparer.Compare(x,y);
            else if ( comparisonStyle != null ) return string.Compare(x,y,comparisonStyle.Value);
            else                                return x.CompareTo(y);
        }
    }
}