c#ToDictionary with ContainsKey check

Bry*_*yan 8 c# linq lambda dictionary todictionary

我有一个列表,我想放在字典中,为简单起见,插入的值将是相同的.

我可以使用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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

以上工作.

但我想用ToDictionary以下列方式做同样的事情 -

    Dictionary<string, int> myDictionary2 = list.ToDictionary(i => i, i => 1);
Run Code Online (Sandbox Code Playgroud)

当然这失败了,因为我加了两次"水".

使用ToDictionary时检查重复条目的正确方法是什么?

Bro*_*ass 14

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

Dictionary<string, int> myDictionary2 = list.Distinct().ToDictionary(i => i, i => 1);
Run Code Online (Sandbox Code Playgroud)

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

foreach (string value in list.Distinct())
{
    myDictionary.Add(value, 1);
}
Run Code Online (Sandbox Code Playgroud)

  • 这会有效,但我想知道OP是否真的需要一套. (7认同)

dev*_*zer 8

Distinct是避免重复密钥问题的一种选择.如果您需要重复计数,您可以尝试更多类似的内容GroupBy,如下所示:

var dict = list.GroupBy(i => i).ToDictionary(g => g.Key, g => g.Count());
Run Code Online (Sandbox Code Playgroud)

如果你的应用程序不仅仅是一个简单的字符串列表/重复计数结构,你可能会从选择一个不同的结构中获得一些里程,比如Lookup你可以通过调用ToLookup扩展来获得- 或者可能像GroupBy上面我使用的那样进行分组.