Как добавить дублирующие ключи в словарь
У меня есть несколько строк из текстовых файлов, которые я хочу добавить в словарь. Я использую словарь в первый раз. Если добавить стартовые строки, то это было нормально, но внезапно у меня появилась ошибка:
Элемент с тем же ключом уже добавлен
Здесь в моем коде есть дубликаты ключей, которые я не могу изменить. Вот мой код в С#
Dictionary<string, string> previousLines = new Dictionary<string, string> { };
previousLines.Add(dialedno, line);
Здесь dialedno - это ключ, а строка - строка текстового файла.
Вот код, из которого я извлекаю данную строку на основе ключа.
string tansferOrginExt = previousLines[dialedno];
Итак, моя забота заключается в том, как разрешить добавлять дубликаты ключей в словарь, если это возможно, и если не так, как я могу получить аналогичную функциональность.
Ответы
Ответ 1
как разрешить добавлять дубликаты ключей в словарь
Это невозможно. Все ключи должны быть уникальными. В качестве Dictionary<TKey, TValue>
реализовано:
Каждый ключ в Dictionary<TKey, TValue>
должен быть уникальным в соответствии со Dictionary<TKey, TValue>
равенства словаря.
Возможные решения - вы можете сохранить коллекцию строк как значение (т. Lookup<TKey, TValue>
Использовать Dictionary<string, List<string>>
), или (лучше) вы можете использовать Lookup<TKey, TValue>
вместо словаря.
Как проверить наличие дубликатов ключей и удалить предыдущее значение из словаря?
Вы можете проверить, существует ли ключ с помощью previousLines.ContainsKey(dialedno)
но если вы всегда хотите удерживать последнюю строку, просто замените любой словарь, который был для ключа, или добавьте новый ключ, если его нет в словаре:
previousLines[dialedno] = line;
Ответ 2
Мы можем использовать список пары значений ключа
List<KeyValuePair<string, string>> myduplicateLovingDictionary= new List<KeyValuePair<string, string>>();
KeyValuePair<string,string> myItem = new KeyValuePair<string,string>(dialedno, line);
myduplicateLovingDictionary.Add(myItem);
Ответ 3
Невозможно добавить повторяющиеся элементы в словарь - альтернативой является использование класса Поиск.
Enumerable.ToLookup Method
Создает общий поиск из IEnumerable.
Ответ 4
Пример:
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
Если ваш вопрос заключается в том, можете ли вы добавить один и тот же ключ дважды, ответ - нет. Однако, если вы хотите просто выполнить итерацию по элементу, а затем увеличить количество значений для конкретного ключа, вы можете добиться этого с помощью "TryAdd". метод.
var dict = new Dictionary<int, int>();
foreach (var item in array)
{
dict.TryAdd(item, 0);
dict[item]++;
}
То же самое, что мы пытаемся достичь, если еще, может быть достигнуто с помощью этого метода ".
https://docs.microsoft.com/en-us/dotnet/api/system.collections.concurrent.concurrentdictionary-2.tryadd?view=netframework-4.7.2