2014-02-10 2 views
0

Что является лучшим методом слияния объекта List в Dictionary с динамическим типом ключа?Объединение списка в словарь с динамическим типом ключа

Для целей отчетности об ошибках, я использую следующий Dictionary

public static Dictionary<object, string> _errors = new Dictionary<object, string>(); 

Однако в определенной части программы я хочу объединить List объектов в Dictionary. Проблема в том, что я хочу включить объекты только из List, которые еще не существуют в Dictionary. Возможно ли это сделать менее процедурным образом, чем переключение между обоими объектами, как я сделал ниже?

//'updates' is a standard List<ZipCodeTerritory> object 
foreach (ZipCodeTerritory zip in updates) 
{ 
    foreach (KeyValuePair<object, string> error in errorList) 
    { 
     if (error.Key is ZipCodeTerritory) 
     { 
      ZipCodeTerritory existingKey = (ZipCodeTerritory) error.Key; 
      if (
       zip.Id != existingKey.Id && 
       zip.ChannelCode != existingKey.ChannelCode && 
       zip.DrmTerrDesc != existingKey.DrmTerrDesc && 
       zip.IndDistrnId != existingKey.IndDistrnId && 
       zip.StateCode != existingKey.StateCode && 
       zip.ZipCode != existingKey.ZipCode && 
       zip.EndDate.Date != existingKey.EndDate.Date && 
       zip.EffectiveDate.Date != existingKey.EffectiveDate.Date && 
       zip.ErrorCodes != existingKey.ErrorCodes && 
       zip.Status != existingKey.Status 
       ) 
      { 
       errorList.Add(zip, string.Empty); 
      } 
     } 
    } 
} 
+1

для начала, вы можете реализовать ['IEquatable'] (http://msdn.microsoft.com/en-us/library/ms131187 (v ​​= vs.100) .aspx) в' ZipCodeTerritory' для рефакторинга или из этого кода сравнения ... – kaveman

+0

Если я правильно понял, мне все равно придется перебирать обе коллекции, хотя я переопределяю метод '.Equals()'. Учтите, что если .Net/Linq/любая другая библиотека или пространство имен имеет функцию, которая может позаботиться об этом быстрее. – NealR

+0

Вы правы, это был всего лишь комментарий/предложение, чтобы помочь вам очистить этот раздел кода (SLOC/sep. Проблем) – kaveman

ответ

0

Из вашего примера кода, не используется словарь Value, это всегда String.Empty. Возможно, понадобится HashSet:

Класс HashSet обеспечивает высокопроизводительные операции набора. Набор представляет собой набор, который не содержит повторяющихся элементов и элементы которого не имеют особого порядка.

Поэтому:

var errorList = new HashSet<ZipCodeTerritory>(updates); 

Редактировать

Вы также должны убедиться, что компаратор равенство указано, или что Equals(object obj) правильно реализован Equals(object obj)

+0

Я использую 'string.empty' в этом конкретном случае – NealR

+0

HashSet по-прежнему чувствует себя как лучший способ получить не дублированные результаты. Затем набор может быть запрошен с помощью Linq для использования, как вам нужно. –

0

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

Dictionary<dynamic, string> _errors = new Dictionary<dynamic, string>(); 

if(from c in _errors where(key.zip.Id != existingKey.Id && 
       key.zip.ChannelCode != existingKey.ChannelCode && 
       key.zip.DrmTerrDesc != existingKey.DrmTerrDesc && 
       key.zip.IndDistrnId != existingKey.IndDistrnId && 
       key.zip.StateCode != existingKey.StateCode && 
       key.zip.ZipCode != existingKey.ZipCode && 
       key.zip.EndDate.Date != existingKey.EndDate.Date && 
       key.zip.EffectiveDate.Date != existingKey.EffectiveDate.Date && 
       key.zip.ErrorCodes != existingKey.ErrorCodes && 
       key.zip.Status != existingKey.Status) select c.key).FirstOrDefault()==null) 
{ 
errorList.Add(zip, string.Empty); 

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