如何使用变量命名字典/列表

时间:2015-01-22 11:20:30

标签: c# json visual-studio dictionary

我收到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变量的方法。如果这适用于列表,那也可以,{I} 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; }
        }

4 个答案:

答案 0 :(得分: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);
}

答案 1 :(得分:2)

您正在寻找的是词典词典:

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

答案 2 :(得分:2)

你不是。 C#中的变量名永远不会动态 - 听起来你想要一张从ID到#34的时间戳到项目&#34的字典。

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

答案 3 :(得分:1)

如您所知,您无法动态创建这样的变量名称。

可以创建字典词典:

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