好的,所以我基本上试图将每行包含1个单词的.txt文件的内容加载到字典中.
当这个文件中的单词是英文时,我没有遇到任何问题,但是将文件更改为带有重音的语言,我开始遇到问题.
必须在创建流阅读器时更改编码,还要在将单词添加到词典时使用ToLower方法中的文化.
基本上我现在有类似的东西:
if (!dict.ContainsKey(word.ToLower(culture)))
dict.Add(word.ToLower(culture), true);
Run Code Online (Sandbox Code Playgroud)
问题是像"esta"和"está"这样的词被认为是相同的.那么,有没有办法将ContainsKey方法设置为特定语言,还是我们需要在类似的行中实现某些东西?无论哪种方式,我都是c#的新手,所以我想请一个例子.
另一个问题淹没了新文件...在一百个单词后,它停止添加文件的其余部分,留下一个单词不完整...但我不能在该单词中看到任何特殊的字符来结束方法的执行,任何关于这个问题的想法?
非常感谢.
编辑:使用Jon Skeet sugestion解决了第一个问题.
关于第二个问题:好的,将文件格式更改为UTF8并删除了流阅读器中的编码,因为它现在可以正确识别重音符号.现在测试关于第二个问题的一些东西.
第二个问题也解决了,这是我的一个错误......耻辱......
快速回答每个人的问题,特别是Jon Skeet.
我正在寻找一种最有效的方法来排序一堆pairs<string, float>按值,因为我需要获得大量对的3个最高条目.
我的自然反应是使用sortedList,但显然它只按键排序,我不能使用反向列表解决方案,因为我知道字符串是唯一的,但浮点数可能不是.
我忽略了任何简单有效的解决方案?
我需要根据指定的下限删除字典中的所有条目.
我目前的解决方案是:
List<string> keys = new List<string>();
foreach (KeyValuePair<string, int> kvp in dic)
{
if (kvp.Value < lowerBound)
keys.Add(kvp.Key);
}
foreach (string key in keys)
dic.Remove(key);
Run Code Online (Sandbox Code Playgroud)
然而,这相当昂贵,特别是因为字典的大小相当大.
我见过LINQ解决方案,如:
foreach(var kvp in dic.Where(kvp.Value <= lowerBound).ToDictionary())
{
dic.Remove(kvp.Key);
}
Run Code Online (Sandbox Code Playgroud)
我认为它更好,因为它只是一个foreach,但我得到:
当前上下文中不存在名称"kvp"
无法从用法中推断出方法'System.Linq.Enumerable.Where(System.Collections.Generic.IEnumerable,System.Func)'的类型参数.尝试显式指定类型参数.
我承认我对LINQ一无所知,所以任何想法如何使第二个解决方案工作,或更好的?
我的想法是在重置前一个的所有值时复制字典,所以我有这个指令:
var dic2 = new Dictionary<string, int>(dic.ToDictionary(kvp => kvp.Key, kvp => 0));
Run Code Online (Sandbox Code Playgroud)
但是我这样做有一个意想不到的问题,因为新复制的字典没有与前一个字典相同的键顺序.
有没有办法重置值但保持相同的键顺序?Witouth采取某种类型的排序?