2

我不能拥有相同的钥匙。但是一个简单(有效)的解决方案是在键后面加上一个后缀。

但是当我在 foreach 中时,我想知道一种快速而干净的方法来为重复的键添加数字后缀。

例如:

我的 foreach 是:

foreach (Item item in items) {
    dic.Add(item.SomeKey, item.SomeValue);
}

但我不想要重复的键,所以我需要“处理” SomeKeyOrigin成为Result

SomeKey 来源:key, clave, clave, chave, chave, chave
SomeKey 结果:key, clave, clave1, chave, chave1, chave2


编辑:我对@KooKiz 的回答更好地解释了这个问题。

我几乎没有重复的条目。我只是想弄清楚如何then increment the suffix until you find no item。听起来像重新发明轮子,所以我想知道是否有人知道这样做的好方法

4

3 回答 3

2

这可能不是最快的,但这是我能想到的更具可读性:

        var source = new List<Tuple<string, string>>
        {
            new Tuple<string, string>("a", "a"),
            new Tuple<string, string>("a", "b"),
            new Tuple<string, string>("b", "c"),
            new Tuple<string, string>("b", "d"),
        };

        var groups = source.GroupBy(t => t.Item1, t => t.Item2);

        var result = new Dictionary<string, string>();

        foreach (var group in groups)
        {
            int index = 0;

            foreach (var value in group)
            {
                string key = group.Key;

                if (index > 0)
                {
                    key += index;
                }

                result.Add(key, value);

                index++;
            }
        }

        foreach (var kvp in result)
        {
            Console.WriteLine("{0} => {1}", kvp.Key, kvp.Value);
        }
于 2011-11-24T13:24:28.537 回答
1

如果您想要一个带有多个“子”项目的键,试试这个

Dictionary<string, List<string>> myList = new Dictionary<string, List<string>>();
foreach (Item item in items)
{
    if (myList[item.SomeKey] == null)
        myList.Add(item.SomeKey, new List<string>());
    myList[item.SomeKey].Add(item.SomeValue);
} 
于 2011-11-24T12:59:04.247 回答
0
var a = items.GroupBy(p => p.SomeKey)
.SelectMany(q => q.Select((value, index) =>
 new Item { SomeKey = (q.Count() > 1 && index > 0) ? value.SomeKey + (index) :  
         value.SomeKey, SomeValue = value.SomeValue }))
.ToDictionary(p => p.SomeKey, q => q.SomeValue);
于 2011-11-24T13:21:45.153 回答