我有一个列表要放在字典中,为简单起见,插入的值都是相同的。
我可以使用foreach循环。
List<string> list = new List<string>();
list.Add("Earth");
list.Add("Wind");
list.Add("Fire");
list.Add("Water");
list.Add("Water"); // Will NOT BE INSERTED using the foreach loop
var myDictionary= new Dictionary<string, int>();
foreach (string value in list)
{
if (!myDictionary.ContainsKey(value))
{
myDictionary.Add(value, 1);
}
}
以上作品。
但我想使用ToDictionary以下列方式做同样的事情 -
Dictionary<string, int> myDictionary2 = list.ToDictionary(i => i, i => 1);
当然这失败了,因为我两次加入“水”。
使用ToDictionary时检查重复条目的正确方法是什么?
答案 0 :(得分:14)
您可以使用Distinct()
过滤重复项:
Dictionary<string, int> myDictionary2 = list.Distinct().ToDictionary(i => i, i => 1);
同样的方法也会使您的传统循环更清晰,因为您不必“手动”检查重复项:
foreach (string value in list.Distinct())
{
myDictionary.Add(value, 1);
}
答案 1 :(得分:7)
Distinct
是避免重复密钥问题的一种选择。如果您需要重复计数,您可以尝试更多类似GroupBy
的内容,如下所示:
var dict = list.GroupBy(i => i).ToDictionary(g => g.Key, g => g.Count());
如果您的应用程序不仅仅是一个简单的字符串列表/重复计数结构,那么您可以从选择Lookup
之类的其他结构获得一些里程,您可以通过调用ToLookup
扩展名获得该结构 - 或者像我上面使用的GroupBy
那样进行分组。