带有ContainsKey检查的c#ToDictionary

本文关键字:c#ToDictionary 检查 ContainsKey 带有 | 更新日期: 2023-09-27 18:29:37

我有一个列表,我想把它放在字典里,为了简单起见,插入的值都是一样的。

我可以使用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时,检查重复条目的正确方法是什么?

带有ContainsKey检查的c#ToDictionary

您可以使用Distinct()来过滤重复项:

Dictionary<string, int> myDictionary2 = list.Distinct().ToDictionary(i => i, i => 1);

同样的方法也会让你的传统循环更加清晰,因为你不必"手动"检查重复:

foreach (string value in list.Distinct())
{
    myDictionary.Add(value, 1);
}

Distinct是避免重复密钥问题的一个选项。如果你需要一个重复的计数,你可以尝试更像这样的GroupBy如下:

var dict = list.GroupBy(i => i).ToDictionary(g => g.Key, g => g.Count());

如果您的应用程序不仅仅是一个简单的字符串列表/重复计数结构,那么您可能会通过选择一个不同的结构(如Lookup)来获得一些好处,该结构可以通过调用ToLookup扩展来获得,或者可能使用一个Grouping(如我上面使用的GroupBy)。