Search code examples
c#.netlinq.net-corelinq-to-entities

c# cross join two same type of lists


So here I have some code, which works ok. But I want to change the select part to something else, I am not sure what other methods I can use any help would be appreciated.

using System;
using System.Linq;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {
        var all = new List<People>{new People{Id = 1, Name = "andy1", Age = null}, new People{Id = 2, Name = "andy2", Age = null}, new People{Id = 3, Name = "andy3", Age = null}, new People{Id = 4, Name = "andy4", Age = null}, };
        var someOfThem = new List<People>{new People{Id = 1, Name = null, Age = 1}, new People{Id = 2, Name = null, Age = 1},new People{Id = 3, Name = null, Age = 1}};
        var test = someOfThem.Select(c =>
        {
            c.Name = all.Find(a => a.Id == c.Id).Name;
            return c;
        });
        foreach (var item in test)
            Console.WriteLine("{0}={1}={2}", item.Id, item.Name, item.Age);
    }
}

public class People
{
    public int Id
    {
        get;
        set;
    }

    public int? Age
    {
        get;
        set;
    }


    public string Name
    {
        get;
        set;
    }
}

And here is the result.

1=andy1=1
2=andy2=1
3=andy3=1

I am just wondering is there another way to achieve the same result but a more elegant way? or an easier way?

        var test = someOfThem.Select(c =>
        {
            c.Name = all.Find(a => a.Id == c.Id).Name;
            return c;
        });

Update Sorry I did not show my problem properly at first, I have updated my quesiton. Please have a look again.


Solution

  • You can use the Join (you can also use a dictionary, but I'm not going to show it):

    Here's the syntax for join:

    var test = someOfThem.Join(all, item => item.Id, element => element.Id, 
      (item, element) => new Person { 
        Id = item.Id ?? element.Id,
        Name = item.Name ?? element.Name,
        Age = item.Age ?? element.Age
      });