innerHTML не является злым вообще. Нет ничего неправильно с использованием его, пока Вы знаете о последствиях.
Я бы, вероятно, использовал словарь, а не список:
// 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);
}
Если вы говорите о свойствах объекта, это будет сложнее, но все же выполнимо.
Это 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.
Если у вас есть оба списка отсортированы по идентификатору , вы можете использовать вариант классического алгоритма слияния:
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;
}
}