Robert Robert - 1 year ago 70
C# Question

How to join two Lists based on common property

Suppose I have two

consists of the two properties

Id (of type
) and

Value (of type

I need to get a list out of these two lists that is made of (anonymous) objects like this:

Id, [Double value from List 1], [Double value from List 2]

So if for a given Id both lists contain a value, it should look like this example:

12, 21.75, 19,87

If one list does not contain an object with an Id that is present in the other list, the value should be null:

15, null, 22.52

How can I achieve that? Thanks for your help!

Update: I know how I could get such a list, of course, but I'm looking for the most performant way to do it, preferrably by using some witty Linq magic.

Answer Source

Not sure how optimized this is, but should suit your needs - Assuming I understood what you wanted:

var enumerable1 = new[]
    new {Id = "A", Value = 1.0},
    new {Id = "B", Value = 2.0},
    new {Id = "C", Value = 3.0},
    new {Id = "D", Value = 4.0},
    new {Id = "E", Value = 5.0},

var enumerable2 = new[]
    new {Id = "A", Value = 6.0},
    new {Id = "NOT PRESENT", Value = 542.23},
    new {Id = "C", Value = 7.0},
    new {Id = "D", Value = 8.0},
    new {Id = "E", Value = 9.0},

var result = enumerable1.Join(enumerable2, arg => arg.Id, arg => arg.Id,
    (first, second) => new {Id = first.Id, Value1 = first.Value, Value2 = second.Value});

foreach (var item in result)
    Console.WriteLine("{0}: {1} - {2}", item.Id, item.Value1, item.Value2);

The resulting output would be something akin to:

A: 1 - 6
C: 3 - 7
D: 4 - 8
E: 5 - 9

Don't really see why you would want null values returned, unless you absolutely need to (Besides, double is not-nullable, so it would have to be the resulting combined entry that would be null instead).

Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download