2013-05-06 2 views
0

У меня есть словарь с ключевыми значениями, и я пытаюсь обрезать расширение этих значений, но получаю сообщение об исключении, что элемент с тем же ключом уже добавлен.Исключение при обрезке расширения ключевых значений словаря

Не знаете, почему это так.

Это код, который я использовал

Как я могу решить эту проблему?

dictFilesNotThere = dictFilesNotThere.ToDictionary 
      (t => t.Key.Remove(8, 3), t => t.Value); 

Ключевое значение как следует «7dim-058-нс», и я пытаюсь получить его «7dim-058» вместо

+0

Вам необходимо сформулировать новый план потенциальных столкновений; ваш план «надежды нет» - это неудача. – dlev

+0

Кроме того, вы действительно выполняете поиск по вашему словарю? Если нет, вы можете рассмотреть «Список >», который с радостью позволит дублировать «ключи». – dlev

+0

'dictFilesNotThere.GroupBy (t => t.Key.Remove (8, 3)). Где (g => g.Count()> 1) .SelectMany (t => t.Key)' Этот запрос покажет вам проблемы. – spender

ответ

2

Предположим, у вас есть следующие пункты в словаре:

dictFilesNotThere.Add("7dim-058-ns", 1); 
dictFilesNotThere.Add("7dim-058-n2", 2); 
dictFilesNotThere.Add("7dim-058-n3", 2); 

Затем после удаления через t.Key.Remove(8, 3) вы получите: 7dim-058 в качестве ключа для всех вышеперечисленных элементов. Поскольку в словаре вы не можете дублировать ключи, вот почему это исключение.

Чтобы избавиться от проблемы, вы можете установить counter и добавить это к ключу, если ключ находится в словаре раньше. Что-то вроде:

Dictionary<string, int> dictFilesNotThereCopy = new Dictionary<string, int>(); 
int counter = 0; 
foreach (KeyValuePair<string,int> item in dictFilesNotThere) 
{ 
    if (dictFilesNotThereCopy.ContainsKey(item.Key.Remove(8, 3))) 
     dictFilesNotThereCopy.Add((item.Key.Remove(8, 3) + (counter++)).ToString(), item.Value); 
    else 
     dictFilesNotThereCopy.Add(item.Key.Remove(8, 3), item.Value); 
} 
1

Если же ключ уже существует, вы должны указать, какой вы хотите сохранить, например, первое:

dictFilesNotThere.Select(kv => new { kv, newkey = kv.Key.Substring(0, 8) }) 
      .GroupBy(x => x.newkey) 
      .ToDictionary(g => g.Key, g => g.First().kv.Value);