【问题标题】:how to populate a list dynamically within a dictionary in c#?如何在 C# 中的字典中动态填充列表?
【发布时间】:2016-04-18 06:35:01
【问题描述】:

我想填充一个列表 dictionary.timeslot_events.Add(t, new List<int>() { i }); 但它给了我一个例外,已经添加了更多具有相同密钥的项目。
我还尝试使用添加函数timeslot_events.Add(t, new List<int>() { i }); 填充列表,但给我的例外是字典中不存在给定的键。

请指导我如何成功填充它。?在 C++ 中,我曾经这样做过 map<int, vector<int>>

for (int i = 0; i < data.noevents; i++)
{
    int t = (int)(rg.Next(1, 45));
    Console.WriteLine(t);
    timeslot_events.Add(t, new List<int>() { i });

}

【问题讨论】:

  • 您正在生成 1-45 之间的随机数,并将它们用作键。可能会生成两次相同的数字,并且字典必须具有唯一键。
  • 在 c++ 中我曾经用 map> 做 i
  • 你应该正确解释你到底想要什么?你想要什么作为关键,什么作为价值
  • 1.您的第一种和第二种方法是相同的。您基本上不能将具有相同键的项目多次添加到字典中,就这么简单。尝试timeslot_events[t] = new List&lt;int&gt;() { i }) 添加或更新字典。 2. 告诉我们变量rg是如何获得的。这可能是关键。 3. 如果你想继续添加到内部列表,首先获取键的内部列表并添加到它(如果不存在,为该键创建一个新列表)
  • 但我想添加具有相同键的项目列表。我如何在 C# 中做到这一点?

标签: c# list dictionary dynamic collections


【解决方案1】:

检查键是否已经存在,然后针对该键添加,否则插入新的 KeyValue 对,如下所示:

for (int i = 0; i < data.noevents; i++)
{
    int t = (int)(rg.Next(1, 45));
    Console.WriteLine(t);
    if (timeslot_events.ContainsKey(t))
    {
        if (timeslot_events[t] == null)
        {
            timeslot_events[t] = new List<int>();
        }
        timeslot_events[t].Add(i);
    }
    else
    {
        timeslot_events.Add(t, new List<int>() { i });
    }   

}

【讨论】:

    【解决方案2】:

    我会使用一点 LINQ。

    var query = 
        from n in Enumerable.Range(0, data.noevents)
        group n by rg.Next(1, 45);
    
    foreach (var x in query)
    {
        timeslot_events.Add(x.Key, x.ToList());
    }
    

    【讨论】:

      猜你喜欢
      • 2014-01-02
      • 1970-01-01
      • 2017-04-07
      • 2013-04-28
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      • 2021-07-28
      • 2015-11-12
      相关资源
      最近更新 更多