Сравнить словарь <строка, список <object>> - PullRequest
2 голосов
/ 27 октября 2010

Я сравниваю два словаря (dic1 и dic2) с правилом, которое получает значения из dic2, где ключ совпадает, но значения не совпадают или ключ отсутствует в dic2.
Не нужно перебирать dic2 для пропущенных / разных значений в dic1.

Ниже код работает нормально. Я хотел бы знать, есть ли лучший способ использования .NET 2.0 (БЕЗ LINQ).

если требуется оптимизация, какой вариант лучше?

Dictionary<string,List<foo>> dic1 = new Dictionary<string,List<foo>>();
Dictionary<string,List<foo>> dic2 = new Dictionary<string,List<foo>>();

dic1.add("1", new foo("a"));
dic1.add("2", new foo("b"));
dic1.add("3", new foo("c"));
dic1.add("3", new foo("c1"));
dic1.add("4", new foo("d"));

dic2.add("1", new foo("a"));
dic2.add("2", new foo("b1"));
dic2.add("3", new foo("c"));
dic2.add("3", new foo("c2"));

//I write code which allow duplicate key in dictionary 

Вариант 1

foreach (KeyValuePair<string, List<foo>> var in dic1)
{
    if (dic2.ContainsKey(var.Key))
    {
        List<foo> tempList = var.Value.FindAll(delegate(foo s)
        {
            return !dic2[var.Key].Contains(s);
        });
        result.AddRange(tempList);
    }
    else
    {
        result.Add(var.Value);
    }

}

Вариант 2

List<string> list1key = new List<string>(dic1.Keys);

list1key.ForEach(delegate(string key)
{
    if (dic2.ContainsKey(key))
    {
        List<foo> tempList = dic1[key].FindAll(delegate(foos)
           {
               return !dic2[key].Contains(s);
           });
        result.AddRange(tempList);
    }
    else
    {
        result.AddRange(dic1[key]);
    }
});

Ответы [ 2 ]

2 голосов
/ 27 октября 2010

Я бы использовал Вариант 1. Вот вариант с использованием TryGetValue вместо того, чтобы искать dic2[var.Key] так много раз:

foreach (KeyValuePair<string, List<foo>> var in dic1) 
{
    List<foo> dic2val;
    if (dic2.TryGetValue(var.Key, out dic2val)) 
    { 
        List<foo> tempList = var.Value.FindAll(delegate(foo s) 
        { 
            return !dic2val.Contains(s); 
        }); 
        result.AddRange(tempList); 
    } 
    else 
    { 
        result.Add(var.Value); 
    } 
} 
2 голосов
/ 27 октября 2010

Вы можете ускорить работу с любой из опций, если используете TryGetValue при доступе к dic2, поэтому вам нужно только один раз выполнить поиск ключа.

Ваша первая опция выглядит проще и, возможно, быстрее, я бы пошел стот.Приветствия

...