Слияние и обновление два списка в C#

innerHTML не является злым вообще. Нет ничего неправильно с использованием его, пока Вы знаете о последствиях.

6
задан casperOne 21 May 2012 в 11:50
поделиться

4 ответа

Я бы, вероятно, использовал словарь, а не список:

    // sample data
    var original = new Dictionary<int, int?>();
    for (int i = 1; i <= 10; i++)
    {
        original.Add(i, null);
    }
    var updated = new Dictionary<int, int>();
    updated.Add(2, 67);
    updated.Add(4, 90);
    updated.Add(5, 98);
    updated.Add(11, 20); // add

    // merge
    foreach (var pair in updated)
    {
        original[pair.Key] = pair.Value;
    }

    // show results
    foreach (var pair in original.OrderBy(x => x.Key))
    {
        Console.WriteLine(pair.Key + ": " + pair.Value);
    }

Если вы говорите о свойствах объекта, это будет сложнее, но все же выполнимо.

3
ответ дан 8 December 2019 в 16:08
поделиться

Это O (m * n), но оно должно работать для произвольных списков

        foreach (var record in List1)
        {
            var other = List2.FirstOrDefault(x => x.Key == record.Key);
            if(other != null) record.Value = other.Value;
        }

Если списки гарантированно упорядочены, то его можно уменьшить до O (n) за счет больше кода. Алгоритм будет выглядеть так:

Current items start as head of each list
While items remain in both lists
  If the current item of list1 has lower key than list2  advance to next in list1
  else if the current item of list2 has lower key than list1  advance to next in list2
  else copy value from current list2 item into list1 item and advance both lists.
3
ответ дан 8 December 2019 в 16:08
поделиться

Если у вас есть оба списка отсортированы по идентификатору , вы можете использовать вариант классического алгоритма слияния:

int pos = 0;
foreach (var e in list2) {
  pos = list1.FindIndex(pos, x => x.Id==e.Id);
  list1[pos].Value = e.Value;
}

Обратите внимание, что для этого также требуется, чтобы list2 был строгим подмножеством list1 в условия идентификатора (например, список1 действительно содержит все идентификаторы из list2 )

Конечно, вы также можете обернуть это в метод расширения

public static void UpdateWith<T>(this List<T> list1, List<T> list2) 
where T:SomeIdValueSupertype {
  int pos = 0;
  foreach (var e in list2) {
    pos = list1.FindIndex(pos, x => x.Id==e.Id);
    list1[pos].Value = e.Value;
  }
}
0
ответ дан 8 December 2019 в 16:08
поделиться

использовать linq: list1 = list2.Union (list1);

9
ответ дан 8 December 2019 в 16:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: