【问题标题】:How to name dictionary/list with variable如何用变量命名字典/列表
【发布时间】:2015-01-22 11:20:29
【问题描述】:

我得到了 JSON 数据,我需要创建不同数量的字典来存储事件。我似乎无法弄清楚或找到并回答这样的事情:

创建字典:

foreach (Identity x in List.Identities)
{
    Dictionary<int, int> shop + x.Id = new Dictionary<int, int>();
    Dictionary<int, int> de + x.Id = new Dictionary<int, int>();
    Dictionary<int, int> sell + x.Id = new Dictionary<int, int>();
}

这样以后我也可以以最高效率输入不同数量的事件:

foreach (Event x in y.events)
{
    if ((x.Type.Contains("PURCHASED")){        
        shop+x.Id.Add(x.timestamp, x.item);
    }
    if ((x.Type.Contains("SOLD")){
        sell+x.Id.Add(x.timestamp, x.item);
    }
    if ((x.Type.Contains("DESTROYED")){
        de+x.Id.Add(x.timestamp, x.item);
    }
}

我知道这绝对不是声明这些的方法,但我找不到在字典名称中声明 int 变量的方法。如果这适用于列表,那也可以,我可以foreach。谢谢!

这是避免混淆的类:

public class Event
        {
            public string Type { get; set; }
            public int timestamp { get; set; }
            public int item { get; set; }
            public int Id { get; set; }
        }

public class ParticipantIdentity
        {
            public int Id { get; set; }
        }

【问题讨论】:

  • 您可以按名称将它们存储在另一个字典中:Dictionary&lt;string, Dictionary&lt;int, int&gt;&gt;
  • 您真的有多个具有相同 ID 的事件吗?你的模型现在让我很困惑。
  • 任何给定的事件最多可以有 7 种不同的类型和最多 12 个不同的 ID。在整个事件列表中,每个 ID 可能会有大约 15 个以上。

标签: c# json visual-studio dictionary


【解决方案1】:

你没有。 C# 中的变量名称从来都不是动态的 - 听起来您想要一个从 ID 到“时间戳到项目的字典”的映射。

事实上,我可能会创建一个单独的类型 ItemEvents 或类似的东西,其中包含具有单个 ID 的项目的所有事件 - 例如通过在其中包含三个字典。

然后你只需要:

var eventsByItem = List.Identities.GroupBy(x => x.Id)
                       .Select(g => new ItemEvents(g.Key, g))
                       .

ItemEvents 构造函数将在哪里进行拆分,例如

public ItemEvents(int id, IEnumerable<Event> events)
{
    this.id = id;
    shops = events.Where(e => e.Type.Contains("PURCHASED"))
                  .ToDictionary(e => e.timestamp, e => e.item);
    // Ditto for the other dictionaries.
}

顺便说一句,我会尝试使用比 int 更有意义的类型作为时间戳 - 并考虑使用 enum 作为事件类型。

【讨论】:

    【解决方案2】:

    您可以创建另一组字典,以 x.Id 为键:

    Dictionary<int, Dictionary<int, int>> shops = Dictionary<int, Dictionary<int, int>>;
    Dictionary<int, Dictionary<int, int>> des = Dictionary<int, Dictionary<int, int>>;
    Dictionary<int, Dictionary<int, int>> sells = Dictionary<int, Dictionary<int, int>>;
    

    所以以后你可以这样做:

    foreach (Identity x in List.Identities)
    {
        shops[x.Id] = new Dictionary<int, int>();
        ...
    }
    

    还有这个:

    if ((x.Type.Contains("PURCHASED")){        
        shops[x.Id].Add(x.timestamp, x.item);
    }
    

    【讨论】:

      【解决方案3】:

      您要查找的是字典目录:

      var shops = new Dictionary<int,Dictionary<int, int>>();
      
      foreach (Identity x in List.Identities)
      {
           shops.Add(x.Id,new Dictionary<int, int>());
          //des and shells the same way
      }
      

      然后

      foreach (Event x in y.events)
      {
          if ((x.Type.Contains("PURCHASED")){        
              shops[x.Id].Add(x.timestamp, x.item);
      }
      

      【讨论】:

        【解决方案4】:

        如您所知,您不能像那样动态创建变量名。

        可以创建一个字典字典:

        var dictionaries = new Dictionary<string, Dictionary<int, int>>();
        foreach (Identity x in List.Identities)
        {
            dictionaries.add("shop" + x.Id, new Dictionary<int, int>());
            dictionaries.add("de" + x.Id, new Dictionary<int, int>());
            dictionaries.add("sell" + x.Id, new Dictionary<int, int>());
        }
        
        foreach (Event x in y.events)
        {
            if ((x.Type.Contains("PURCHASED")){        
                dictionaries["shop"+x.Id].Add(x.timestamp, x.item);
            }
            if ((x.Type.Contains("SOLD")){
                dictionaries["sell"+x.Id].Add(x.timestamp, x.item);
            }
            if ((x.Type.Contains("DESTROYED")){
                dictionaries["de"+x.Id].Add(x.timestamp, x.item);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2016-06-07
          • 2019-06-06
          • 2020-03-03
          • 1970-01-01
          • 1970-01-01
          • 2022-06-11
          • 2016-12-17
          • 2014-10-01
          • 1970-01-01
          相关资源
          最近更新 更多