Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Merge and Update Two Lists in C#

I have two List<T> objects:

For example:

List 1:
ID, Value where Id is populated and value is blank and it contains say IDs from 1 to 10.
1,""
2,""
...
10,""

List 2:
ID, Value and other attributes all filled with values but this list is a subset of List 1 in terms of IDs. (e.g only 3 items)
2,67
4,90
5,98

What I want is a merged list 1, but with updated values. Does anyone have any good extension method which will do this or any elegent code to perform this operation. The final list should be:

ID, Value
1,""
2,67 //value from list 2
3,""
4,90
5,98
6,""
...
10,""

like image 494
chugh97 Avatar asked Aug 19 '09 09:08

chugh97


3 Answers

use linq: list1=list2.Union(list1);

like image 106
Ivan_Padabed Avatar answered Nov 09 '22 10:11

Ivan_Padabed


I would probably use a dictionary rather than a list:

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

If you are talking about properties of an object, it will be trickier, but still doable.

like image 31
Marc Gravell Avatar answered Nov 09 '22 10:11

Marc Gravell


This is O(m*n) but should do the job for arbitrary lists

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

If the lists are guaranteed ordered, then it could be brought down to O(n) at the cost of more code. The algortihm would be

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.
like image 20
Steve Gilham Avatar answered Nov 09 '22 10:11

Steve Gilham