我有一个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”,我枚举词典时只显示其中一个
答案 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()) { }
}