Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Linq: find similar objects from two different lists

Tags:

c#

linq

I've got two separate lists of custom objects. In these two separate lists, there may be some objects that are identical between the two lists, with the exception of one field ("id"). I'd like to know a smart way to query these two lists to find this overlap. I've attached some code to help clarify. Any suggestions would be appreciated.

namespace ConsoleApplication1
{
class userObj
{
    public int id;
    public DateTime BirthDate;
    public string FirstName;
    public string LastName;
}

class Program
{
    static void Main(string[] args)
    {
        List<userObj> list1 = new List<userObj>();
        list1.Add(new userObj()
        {
            BirthDate=DateTime.Parse("1/1/2000"),
            FirstName="John",
            LastName="Smith",
            id=0
        });
        list1.Add(new userObj()
        {
            BirthDate = DateTime.Parse("2/2/2000"),
            FirstName = "Jane",
            LastName = "Doe",
            id = 1
        });
        list1.Add(new userObj()
        {
            BirthDate = DateTime.Parse("3/3/2000"),
            FirstName = "Sam",
            LastName = "Smith",
            id = 2
        });



        List<userObj> list2 = new List<userObj>();
        list2.Add(new userObj()
        {
            BirthDate =  DateTime.Parse("1/1/2000"),
            FirstName = "John",
            LastName = "Smith",
            id = 3
        });
        list2.Add(new userObj()
        {
            BirthDate = DateTime.Parse("2/2/2000"),
            FirstName = "Jane",
            LastName = "Doe",
            id = 4
        });


        List<int> similarObjectsFromTwoLists = null;
        //Would like this equal to the overlap. It could be the IDs on either side that have a "buddy" on the other side: (3,4) or (0,1) in the above case.

    }
}
}
like image 820
BenjiFB Avatar asked Jan 10 '23 19:01

BenjiFB


1 Answers

I don't know why you want a List<int>, i assume this is what you want:

var intersectingUser = from l1 in list1
                       join l2 in list2
                       on new     { l1.FirstName, l1.LastName, l1.BirthDate }
                       equals new { l2.FirstName, l2.LastName, l2.BirthDate }
                       select new { ID1 = l1.id, ID2 = l2.id };
foreach (var bothIDs in intersectingUser)
{
    Console.WriteLine("ID in List1: {0} ID in List2: {1}", 
                     bothIDs.ID1, bothIDs.ID2);
}

Output:

ID in List1: 0 ID in List2: 3
ID in List1: 1 ID in List2: 4
like image 96
Tim Schmelter Avatar answered Jan 19 '23 14:01

Tim Schmelter