Question

I have a KeyValuePair List in C# formatted as string,int with an example content:

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

I want some code to delete one of the items and to the other add the duplicating values.
So it would be:

mylist[0]=="str1",13

Definition Code:

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

Thomas, I'll try to explain it in pseudo code. Basically, I want

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

Becoming:

mylist[m]==samestring,someint+otherint
Was it helpful?

Solution

var newList = myList.GroupBy(x => x.Key)
            .Select(g => new KeyValuePair<string, int>(g.Key, g.Sum(x=>x.Value)))
            .ToList();

OTHER TIPS

var mylist = new KeyValuePair<string,int>[2];

mylist[0]=new KeyValuePair<string,int>("str1",5);
mylist[1]=new KeyValuePair<string,int>("str1",8);
var output = mylist.GroupBy(x=>x.Key).ToDictionary(x=>x.Key, x=>x.Select(y=>y.Value).Sum());

I would use a different structure:

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

The first dictionary should be your original structure. To add elements to it check first if key exist, if it exist just add the element to the value list, if it doesn't exist and a new item to the dictionary. The second dictionary is just a projection of the first one summing the list of values for each entry.

A non-Linq answer:

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]);
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top