当我在C#中编码时,我在代码中使用System.Collections.Generic.SortedDictionary<char,int>
。
但是当我调用它的Max()
方法时,它会引发异常:
mscorlib.ni.dll中发生了'System.ArgumentException'类型的异常,但未在用户代码中处理
附加信息:至少有一个对象必须实现IComparable。
不Char
实施IComparable
?我该如何解决?
谢谢!
Ps:我的代码很简单:
SortedDictionary<char,int> letter = new SortedDictionary<char,int>;
//some codes
if (letter.Count != 0) var First = letter.Max();
答案 0 :(得分:4)
Max()
是IEnumerable<T>
的扩展方法,SortedDictionary<TKey, TValue>
实施IEnumerable<KeyValuePair<TKey, TValue>>
。
问题是KeyValuePair<TKey, TValue>
不是IComparable
。
如果您想要最大密钥,可以使用Keys
属性:
SortedDictionary<char, int> dict = new SortedDictionary<char, int>();
...
var key = dict.Keys.Max();
var value = dict[key];
修改强>
如果要计算重复字符的次数,请不要使用SortedDictionary<TKey, Value>
,添加到集合中的每个元素都需要 O(log n)。最后,添加流程将采用 O(n log n)操作。
在您的情况下,简单的Dictionary<TKey, TValue>
或数组更合适:
var dict = new Dictionary<char, int>();
foreach (char c in chars)
{
if (!dict.ContainsKey(c))
dict[c] = 0;
dict[c]++;
}
var maxValue = dict.Values.Max();
var keyValues = dict.Where(kv => kv.Value == maxValue);
在上面的代码中,您可以找到最大数量,然后找到具有该值的字符。