如何用变量命名 dictionary/list

How to name dictionary/list with variable

我得到了 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; }
        }

您可以创建另一组词典,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);
}

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

可以创建字典的字典:

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);
    }
}

你要找的是字典中的字典:

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);
}

你不知道。 C# 中的变量名从来都不是动态的——听起来你想要一个从 ID 到 "dictionary of timestamp to item".

的映射

事实上,我可能会创建一个单独的类型 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 作为事件类型。