Правильный способ сравнить два списка> в C # 2.0 - PullRequest
3 голосов
/ 26 октября 2010

Это правильный способ сравнения в C # 2.0 (БЕЗ LINQ).

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

        List<KeyValuePair<string, foo>> list1 = new List<KeyValuePair<string, foo>>();
        List<KeyValuePair<string, foo>> list2 = new List<KeyValuePair<string, foo>>();
        List<foo> diffList = new List<foo>();

        list1.Add(new KeyValuePair<string, foo>("1", new foo("1", new Cost(1.0)));
        list1.Add(new KeyValuePair<string, foo>("2", new foo("2", new Cost(2.0)));
        list1.Add(new KeyValuePair<string, foo>("3", new foo("3", new Cost(3.0)));
        list1.Add(new KeyValuePair<string, foo>("5", new foo("5", new Cost(5.0)));

        list2.Add(new KeyValuePair<string, foo>("1", new foo("1", new Cost(1.0));
        list2.Add(new KeyValuePair<string, foo>("2", new foo("2", new Cost(2.1)));
        list2.Add(new KeyValuePair<string, foo>("4", new foo("4", new Cost(4.0));
        list2.Add(new KeyValuePair<string, foo>("6", new foo("6", new Cost(6.0)));
        list2.Add(new KeyValuePair<string, foo>("7", new foo("7", new Cost(7.0)));

        foreach (KeyValuePair<string, foo> pair1 in list1)
        {
            bool b = true;
            foreach (KeyValuePair<string, foo> pair2 in list2)
            {
                if (pair2.Key == pair1.Key)
                {
                    if (pair2.Value.Equals(pair1.Value))
                    {
                        list2.Remove(pair2);
                        break;
                    }
                    else
                    {
                        diffList.Add(pair2.Value);
                        diffList.Add(pair1.Value);
                        list2.Remove(pair2);
                        b = false;
                        break;
                    }
                }
                else
                {

                    diffList.Add(pair2.Value);
                    diffList.Add(pair1.Value);
                    list2.Remove(pair2);
                    b = false;
                    break;
                }
            }
            if (list2.Count == 0 && b)
            {
                diffList.Add(pair1.Value);
            }
        }
        foreach (KeyValuePair<string, foo> pair2 in list2)
        {
            diffList.Add(pair2.Value);
        }

Ответы [ 2 ]

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

Марсело прав, список KeyValuePairs всегда лучше представить в виде словаря, ЕСЛИ вы не хотите иметь дублирующие ключи по какой-то причине.

Попробуйте что-то вроде этого:

var a = list1.ToDictionary(i => i.Key, i => i.Value);
var b = list2.ToDictionary(i => i.Key, i => i.Value);
var result = new List<foo>();

foreach (var entry in a)
{
    if (b.ContainsKey(entry.Key) 
        && entry.Value != b[entry.Key])
    {
        result.Add(entry.Value);
        result.Add(b[entry.Key]);
    }
}
foreach (var entry in b)
{
    if (a.ContainsKey(entry.Key) 
        && entry.Value != a[entry.Key] 
        && !result.Contains(entry.Value))
    {
        result.Add(entry.Value);
        result.Add(a[entry.Key]);
    }
}
2 голосов
/ 26 октября 2010

Было бы проще и быстрее:

  1. Вставить оба списка в словари (или создать словари в первую очередь).
  2. Перебирать по одному словарю, просматривая каждый ключв другом словаре, добавляя записи diff соответственно.Добавляйте только записи из словаря, по которому вы перебираете.
  3. Поменяйте местами словари и повторите цикл.
...