Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dictionary<string, int> increase value

Tags:

c#

dictionary

I have a Dictionary<string, int> and I am reading some strings from a list... I want to add them in the dictionary, but if the string is already in the dictionary, I want its value to increase by 1.

The code I tried is as below, but there are some strings that are increased with every input.. Is something wrong?

    Dictionary<string, int> dictionary = new Dictionary<string, int>();
    foreach (String recordline in tags)
    {
        String recordstag = recordline.Split('\t')[1];
        String tagToDic = recordstag.Substring(0, (recordstag.Length-1) );

        if (dictionary.ContainsKey(tagToDic) == false)
        {
            dictionary.Add(tagToDic, 1);
        }
        else
        {

            try
            {
                dictionary[tagToDic] = dictionary[tagToDic] + 1;
            }
            catch (KeyNotFoundException ex)
            {
                System.Console.WriteLine("X" + tagToDic + "X");
                dictionary.Add(tagToDic, 1);
            }
        }
    }

EDIT: To answer your comments... I am removing the last char of the string because it is always a blank space... My input is like:

10000301    business    0   0,000
10000301    management & auxiliary services     0   0,000
10000316    demographie     0   0,000
10000316    histoire de france  0   0,000
10000347    economics   0   0,000
10000347    philosophy   1   0,500

and i want only the string like "business" or "management & auxiliary services" etc.

like image 247
tequilaras Avatar asked Dec 27 '22 09:12

tequilaras


2 Answers

You are splitting each string in the input string array and selecting the 2nd string in the string array. Then you are removing the last character of this 2nd string using SubString. Hence all strings that differ only in the last character would be considered the same and incremented. Thats why you might be seeing "some strings that are increased with every input".

EDIT: If the purpose of removing the last char is to remove space, Use String.Trim instead. Another edit is using TryGetValue instead of ContainsKey which performs better to increment your value. Code has been edited below.

Try this:

    Dictionary<string, int> dictionary = new Dictionary<string, int>();
    foreach(string recordline in tags) 
    {
       string recordstag = recordline.Split('\t')[1].Trim();
       int value;
       if (!dictionary.TryGetValue(recordstag, out value))
         dictionary.Add(recordstag, 1);
       else
         dictionary[recordstag] = value + 1;
    }
like image 156
Kash Avatar answered Dec 30 '22 00:12

Kash


No need for a dictionary, can be solved using this Linq query.
(Assuming you want the complete string after \t)

var q = 
    from s in tags.Select (t => t.Substring(t.IndexOf("\t")))
    group s by s into g
    select new
    {
        g.Key,
        Count = g.Count()
    };

And if you need it as a dictionary just add:

var dic = q.ToDictionary (x => x.Key, x => x.Count);
like image 26
Magnus Avatar answered Dec 29 '22 22:12

Magnus