2016-03-03 2 views
1

У меня есть список KeyValuePair который его значение список тоже, такие какСписок KeyValuePair отличимый

List<KeyValuePair<string, List<string>>> ListX = new List<KeyValuePair<string,List<string>>>(); 
ListX.Add(new KeyValuePair<string,List<string>>("a",list1)); 
ListX.Add(new KeyValuePair<string,List<string>>("b",list1)); 
ListX.Add(new KeyValuePair<string,List<string>>("a",list1));` 

Я хочу, чтобы ключи от каждого KeyValuePair в списке, чтобы быть не дублируется, только ключей, может Я использую Distinct в этом списке?

например, я хочу, чтобы третий элемент в списке имел ключ «a», который должен быть удален, поскольку он дублируется.

+3

использовать 'Словарь <строка, список >' вместо. Добавить метод вызывает исключение, если ключ уже существует. вы можете сначала использовать метод ContainsKey, чтобы проверить, существует ли ключ. или вы можете использовать indexer вместо метода Add, который перезаписывает старое значение, если ключ уже существует. 'dic [" a "] = list1;' –

ответ

1

Хотя можно обойти с текущей List сделать это имея Distinct ключи, самое простое решение, которое я думаю, что подходит для вашего случай использовать Dictionary<string,List<string>>

Это только точно то, что вам нужно:

Dictionary<string, List<string>> dict = new Dictionary<string, List<string>>(); 
dict.Add("a", new List<string>()); 
dict.Add("b", new List<string>()); 
dict.Add("a", new List<string>()); //will throw an error 

Изображение:

enter image description here

Если вам нужно проверить, если в Key уже существует, когда вы хотите добавить <Key,Value> в словаре, просто проверить с помощью ContainsKey:

if (dict.ContainsKey(key)) //the key exists 
+0

Это хорошо работает, у меня не было идеи, что словарь может иметь более 1 элемента. – user1947393

0

Вы можете использовать класс Dictionary<TKey, TValue>, который наследует от IEnumerable<KeyValuePair<TKey, TValue>>. Это коллекция KeyValuePairs, которая позволяет использовать только уникальные ключи.

+0

Это даст мне ошибку, если я пытаюсь добавить дубликат ключа? правильно? Я не хочу, чтобы ошибка появлялась, я хочу, чтобы она не добавляла ее, не давая ошибку – user1947393

+0

@ user1947393 Просто добавьте проверку перед вставкой элемента 'if (! D.ContainsKey (key))' –

0

U можно использовать

Dictionary<TKey, TValue> 

где TKEY и TValue являются общими типами данных.

Например, они могут быть INT, строка, другой словарь и т.д.

Dictionary<int , string>, Dictionary<int , List<employee>> Пример т.д.

Во всех этих случаях ключ является отдельной частью то есть, тот же ключ не может быть снова вставлен.

U может проверить, существует ли ключ с помощью Distinct так, что исключение не возникает, даже если и попытаться добавить те же ключевые

Однако Distinct предотвращает только те же самые ключевые пары значений.

Чтобы предотвратить тот же ключ является Добавлено использование Enumerable.GroupBy
ListItems.Select(item => { long value; bool parseSuccess = long.TryParse(item.Key, out value); return new { Key = value, parseSuccess, item.Value }; }) .Where(parsed => parsed.parseSuccess) .GroupBy(o => o.Key) .ToDictionary(e => e.Key, e => e.First().Value)

+0

Этот код добавит первый «a» как ключ и список. Вы не можете добавить один и тот же ключ «a» в словарь, что является единственной целью добавления словаря. –

0
List<Dictionary<int, List<int>>> list = new List<Dictionary<int, List<int>>>(); //List with a dictinary that contains a list 
int key = Convert.ToInt32(Console.ReadLine()); // Key that you want to check if it exist in the dictinary 
int temp_counter = 0; 

foreach(Dictionary<Int32,List<int>> dict in list) 
{ 
    if(dict.ContainsKey(key)) 
    temp_counter+=temp_counter; 
} 

if (temp_counter == 0) // key not present in dictinary then add a to the list a dictinary object that contains your list 
{ 
    Dictionary<int,List<int>> a = new Dictionary<int,List<int>>(); 
    a.Add(key,new List<int>()); // will contain your list 
    list.Add(a); 
} 

Проверьте, не работает ли это

1
var dictionaryX = ListX 
    .GroupBy(x => x.Key, (x, ys) => ys.First()) 
    .ToDictionary(x => x.Key, x => x.Value); 

Я не уверен, что это то, что вы искали, но это запрос, который преобразует ListX в словарь, беря только первое значение для каждого дубликата ключа.

Смежные вопросы