将列表合并到具有动态键类型的Dictionary中

时间:2014-02-10 23:32:54

标签: c# .net linq dictionary

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);
            }
        }
    }
}

2 个答案:

答案 0 :(得分: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);

}

答案 1 :(得分:0)

在您的代码示例中,未使用字典Value,它始终为String.Empty。也许HashSet会更合适:

  

HashSet类提供高性能的集合操作。集合是一个不包含重复元素的集合,其元素没有特定的顺序。

因此:

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

修改

您还需要确保指定了相等比较器,或者Equals(object obj)正确实现了Equals(object obj)