如何按键长度排序字典

时间:2014-01-08 11:09:14

标签: c# sorteddictionary

我有一个Sorted Dictionary我想按键长度排序。

字典定义为:

private SortedDictionary<String, String> _replacementDictionary;

并初始化为:

_replacementDictionary = new SortedDictionary<string, string>(new LengthComparer());

我以为我可以使用这样的自定义排序:

class LengthComparer : IComparer<String>
{
    public int Compare(string x, string y)
    {
        return x.Length.CompareTo(y.Length);
    }
}

但是这对于长度相同的键不起作用。即如果我添加键“abc”和“xyz”,我枚举词典时只显示其中一个

3 个答案:

答案 0 :(得分:4)

如果您的意思是要按长度排序,那么将密钥本身作为字符串,请尝试:

class LengthComparer : IComparer<String>
{
    public int Compare(string x,string y)
    {
        int lengthComparison=x.Length.CompareTo(y.Length)
        if(lengthComparison==0)
        {
           return x.CompareTo(y);
        }
        else
        {
           return lengthComparison;
        }
    }
 }

这段代码的作用是:它根据长度进行比较。如果两个字符串绑定了长度,那么它通过比较字符串本身而不是它们的长度来解析绑定。你需要解决这个问题因为@Adriano在评论中给出的原因。

答案 1 :(得分:0)

List<KeyValuePair<string, string>> list = _replacementDictionary.ToList();

list.Sort((firstPair, nextPair) =>
    {
        return firstPair.Key.Length.CompareTo(nextPair.Key.Length);
    }
);

_replacementDictionary = list.ToDictionary(pair => pair.Key, pair => pair.Value);

您还没有指定要继续沿IComparer路线行进,所以我希望此代码仍然合适。如果需要,您可以将其包装在扩展中。

注意:我现在无法尝试编译它,所以可能需要清理一下。

答案 2 :(得分:0)

这是我使用的。

using System.Collections.Generic;

public class KeyLengthSortedDictionary : SortedDictionary<string, string>
{
    public int Compare(string x, string y)
        {
            if (x == null) throw new ArgumentNullException(nameof(x));
            if (y == null) throw new ArgumentNullException(nameof(y));
            var lengthComparison = x.Length.CompareTo(y.Length);
            return lengthComparison == 0 ? string.Compare(x, y, StringComparison.Ordinal) : lengthComparison;
        }

    public KeyLengthSortedDictionary() : base(new StringLengthComparer()) { }   
}

以下是演示:https://dotnetfiddle.net/plmFLL