How to add duplicate keys into the Dictionary

2019-03-09 10:06发布

问题:

I have some lines from text files that i want to add into the Dictionary.I am using Dictionary for the first time.While adding up starting lines it was Ok but suddenly i got error:

An item with the same key has already been added

Here in my code there are duplicate keys which i can not change.Here is my code in c#

Dictionary<string, string> previousLines = new Dictionary<string, string> { };
previousLines.Add(dialedno, line);

Here dialedno is the key and line is the textfile line. Here is the code from which i am retrieving the given line based on key.

string tansferOrginExt = previousLines[dialedno];

So my concern is how to allow to add duplicate keys in Dictionary if possible and if not how can i get similar functionality.

回答1:

how to allow to add duplicate keys in Dictionary

It is not possible. All keys should be unique. As Dictionary<TKey, TValue> implemented:

Every key in aDictionary<TKey, TValue> must be unique according to the dictionary's equality comparer.

Possible solutions - you can keep collection of strings as value (i.e. use Dictionary<string, List<string>>), or (better) you can use Lookup<TKey, TValue> instead of dictionary.


how to check for duplicate keys and delete previous value from Dictionary?

Check if key exists before adding new entry:

if (!previousLines.ContainsKey(dialedno))   
     previousLines.Add(dialedno, line); // add new entry
else
     previousLines[dialedno] = line; // update entry value

Also you can use LINQ query to to create dictionary with only last value for each key (assume you have sequence of objects with dialedno and line properties):

var previousLines = sequence.GroupBy(s => s.dialedno)
                            .ToDictionary(g => g.Key, g => g.Last().line);


回答2:

We can Use a List of Key Value Pair

List<KeyValuePair<string, string>> myduplicateLovingDictionary= new List<KeyValuePair<string, string>>();
KeyValuePair<string,string> myItem = new KeyValuePair<string,string>(dialedno, line);
myduplicateLovingDictionary.Add(myItem);


回答3:

Its not possible to add duplicate items to a Dictionary - an alternative is to use the Lookup class.

Enumerable.ToLookup Method

Creates a generic Lookup from an IEnumerable.



回答4:

Example:

class Program
        {
             private static List<KeyValuePair<string, int>> d = new List<KeyValuePair<string, int>>();

            static void Main(string[] args)
            {
                 d.Add(new KeyValuePair<string, int>("joe", 100));
                 d.Add(new KeyValuePair<string, int>("joe", 200));
                 d.Add(new KeyValuePair<string, int>("jim", 100));
                 var result = d.Where(x => x.Key == "joe");
                foreach(var q in result)
                    Console.WriteLine(q.Value   );
                Console.ReadLine();
            }
         }


回答5:

List< KeyValuePair < string, string>> listKeyValPair= new List< KeyValuePair< string, string>>();
KeyValuePair< string, string> keyValue= new KeyValuePair< string, string>("KEY1", "VALUE1");
listKeyValPair.Add(keyValue);


回答6:

If your question is if you can add the same key twice, the answer is No. However if you want to just iterate through the item and then increase the count of the value for the particular Key, you can achieve that by using "TryAdd" method.

var dict = new Dictionary<int, int>();
        foreach (var item in array)
        {
            dict.TryAdd(item, 0);
            dict[item]++;
        }

The same thing we are trying to achieve with if else, can be achieved with this method.``

https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent.concurrentdictionary-2.tryadd?view=netframework-4.7.2