Linq:从两个不同的列表中找到类似的对象

Ben*_*iFB 4 c# linq

我有两个单独的自定义对象列表.在这两个单独的列表中,两个列表之间可能存在一些相同的对象,但一个字段("id")除外.我想知道一种查询这两个列表的智能方法来找到这种重叠.我附上了一些代码来帮助澄清.任何建议,将不胜感激.

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.

    }
}
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 5

我不知道你为什么要这样List<int>,我认为这就是你想要的:

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);
}
Run Code Online (Sandbox Code Playgroud)

输出:

ID in List1: 0 ID in List2: 3
ID in List1: 1 ID in List2: 4
Run Code Online (Sandbox Code Playgroud)