С# - удалить дубликаты ключей из списка KeyValuePair и добавить значение

У меня есть список KeyValuePair на С#, отформатированный как string,int, с примерным содержимым:

mylist[0]=="str1",5
mylist[2]=="str1",8

Я хочу, чтобы какой-нибудь код удалял один из элементов, а к другому добавлял дублирующиеся значения.
Так было бы:

mylist[0]=="str1",13

Код определения:

List<KeyValuePair<string, int>> mylist = new List<KeyValuePair<string, int>>();

Томас, я попытаюсь объяснить это на псевдокоде. В принципе, я хочу

mylist[x]==samestring,someint
mylist[n]==samestring,otherint

Став:

mylist[m]==samestring,someint+otherint

person Стефан Дончев    schedule 04.12.2012    source источник
comment
Вы можете добавить код определения mylist?   -  person Mahdi Tahsildari    schedule 04.12.2012
comment
Что вы действительно хотите сделать? Если вы используете псевдокод, постарайтесь быть более явным. Я не думаю, что ваш пример объясняет, что вы хотите сделать.   -  person Tomas Jansson    schedule 04.12.2012
comment
Вам действительно нужно сохранить порядок?   -  person Alvin Wong    schedule 04.12.2012
comment
Смотрите мой ответ, который дает вам то, что вы хотите.   -  person Tomas Jansson    schedule 04.12.2012


Ответы (2)


Я бы использовал другую структуру:

class Program
{
    static void Main(string[] args)
    {
        Dictionary<string, List<int>> dict = new Dictionary<string, List<int>>();
        dict.Add("test", new List<int>() { 8, 5 });
        var dict2 = dict.ToDictionary(y => y.Key, y => y.Value.Sum());
        foreach (var i in dict2)
        {
            Console.WriteLine("Key: {0}, Value: {1}", i.Key, i.Value);
        }
        Console.ReadLine();
    }
}

Первый словарь должен быть вашей исходной структурой. Чтобы добавить в него элементы, сначала проверьте, существует ли ключ, если он существует, просто добавьте элемент в список значений, если он не существует, и новый элемент в словарь. Второй словарь — это просто проекция первого, суммирующая список значений для каждой записи.

person Tomas Jansson    schedule 04.12.2012

Не-Linq ответ:

Dictionary<string, int> temp = new Dictionary<string, int>();
foreach (KeyValuePair<string, int> item in mylist)
{
    if (temp.ContainsKey(item.Key))
    {
        temp[item.Key] = temp[item.Key] + item.Value;
    }
    else
    {
        temp.Add(item.Key, item.Value);
    }
}
List<KeyValuePair<string, int>> result = new List<KeyValuePair<string, int>>(temp.Count);
foreach (string key in temp.Keys)
{
    result.Add(new KeyValuePair<string,int>(key,temp[key]);
}
person Alvin Wong    schedule 04.12.2012
comment
Чем это лучше, чем просто научиться использовать linq. Для этого конкретного сценария linq гораздо более выразителен. - person Tomas Jansson; 04.12.2012