C# 如何在使用LINQ将一个列表与其他列表进行比较时在其中设置值

C# 如何在使用LINQ将一个列表与其他列表进行比较时在其中设置值,c#,linq,C#,Linq,我有两份清单: List A List B ID FirstName WorkingID ID FirstName WorkingID 5 John Null 5 John 1 9 Patrick Null 9 Patrick 2 16 Ryan Null 16 Ryan 3 我

我有两份清单:

List A                         List B

ID  FirstName  WorkingID       ID  FirstName  WorkingID
5   John       Null            5   John       1 
9   Patrick    Null            9   Patrick    2
16  Ryan       Null            16  Ryan       3
我想使用LINQ比较这些列表,如果两个列表中的ID相等,我想在第一个列表(一个列表)中设置WorkingID。 谢谢

就这么简单


很简单。

您可以尝试类似的方法(不是纯LINQ方法):


您可以尝试这样的方法(不是纯LINQ方法):

试试这个:

listA.Where(a => listB.Any(b => a.ID == b.ID))
    .ToList()
    .ForEach(a => a.WorkingID = listB.First(b => b.ID == a.ID).WorkingID);
试试这个:

listA.Where(a => listB.Any(b => a.ID == b.ID))
    .ToList()
    .ForEach(a => a.WorkingID = listB.First(b => b.ID == a.ID).WorkingID);
也像这样:

A.ForEach(c => c.WorkingID = B.Where(m => m.ID == c.ID).Select(s => s.WorkingID).FirstOrDefault());
完整资料来源:

public class Test
{
    public int ID;
    public int? WorkingID;
}
class Program
{
static void Main(string[] args)
{
    var A = new List<Test>() 
    { 
        new Test { ID = 5, WorkingID = null }, 
        new Test { ID = 9, WorkingID = null }, 
        new Test { ID = 16, WorkingID = null }, 
        new Test { ID = 18, WorkingID = null } 
    };
    var B = new List<Test>() 
    { 
        new Test { ID = 5, WorkingID = 1 }, 
        new Test { ID = 9, WorkingID = 2 }, 
        new Test { ID = 16, WorkingID = 3 } 
    };

    A.ForEach(c => c.WorkingID = B.Where(m => m.ID == c.ID).Select(s => s.WorkingID).FirstOrDefault());
}
}
公共类测试
{
公共int ID;
公共int?WorkingID;
}
班级计划
{
静态void Main(字符串[]参数)
{
var A=新列表()
{ 
新测试{ID=5,WorkingID=null},
新测试{ID=9,WorkingID=null},
新测试{ID=16,WorkingID=null},
新测试{ID=18,WorkingID=null}
};
var B=新列表()
{ 
新测试{ID=5,WorkingID=1},
新测试{ID=9,WorkingID=2},
新测试{ID=16,WorkingID=3}
};
A.ForEach(c=>c.WorkingID=B.Where(m=>m.ID==c.ID)。选择(s=>s.WorkingID.FirstOrDefault());
}
}
也像这样:

A.ForEach(c => c.WorkingID = B.Where(m => m.ID == c.ID).Select(s => s.WorkingID).FirstOrDefault());
完整资料来源:

public class Test
{
    public int ID;
    public int? WorkingID;
}
class Program
{
static void Main(string[] args)
{
    var A = new List<Test>() 
    { 
        new Test { ID = 5, WorkingID = null }, 
        new Test { ID = 9, WorkingID = null }, 
        new Test { ID = 16, WorkingID = null }, 
        new Test { ID = 18, WorkingID = null } 
    };
    var B = new List<Test>() 
    { 
        new Test { ID = 5, WorkingID = 1 }, 
        new Test { ID = 9, WorkingID = 2 }, 
        new Test { ID = 16, WorkingID = 3 } 
    };

    A.ForEach(c => c.WorkingID = B.Where(m => m.ID == c.ID).Select(s => s.WorkingID).FirstOrDefault());
}
}
公共类测试
{
公共int ID;
公共int?WorkingID;
}
班级计划
{
静态void Main(字符串[]参数)
{
var A=新列表()
{ 
新测试{ID=5,WorkingID=null},
新测试{ID=9,WorkingID=null},
新测试{ID=16,WorkingID=null},
新测试{ID=18,WorkingID=null}
};
var B=新列表()
{ 
新测试{ID=5,WorkingID=1},
新测试{ID=9,WorkingID=2},
新测试{ID=16,WorkingID=3}
};
A.ForEach(c=>c.WorkingID=B.Where(m=>m.ID==c.ID)。选择(s=>s.WorkingID.FirstOrDefault());
}
}

这里有一种方法,假设类结构如下:

class MyItem
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public int WorkingID { get; set; }
}
您可以加入匹配ID的第二个列表:

var list1 = new List<MyItem>() {
    new MyItem() { ID = 5, FirstName = "John" },
    new MyItem() { ID = 9, FirstName = "Patrick" },
    new MyItem() { ID = 16, FirstName = "Ryan" },
};

var list2 = new List<MyItem>() {
    new MyItem() { ID = 5, FirstName = "John", WorkingID = 1 },
    new MyItem() { ID = 9, FirstName = "Patrick", WorkingID = 2 },
    new MyItem() { ID = 16, FirstName = "Ryan", WorkingID = 3 },
};

var mergedList = from item1 in list1
                join item2 in list2
                on item1.ID equals item2.ID
                select new MyItem() { ID = item1.ID, FirstName = item1.FirstName, WorkingID = item2.WorkingID };
var list1=新列表(){
new MyItem(){ID=5,FirstName=“John”},
new MyItem(){ID=9,FirstName=“Patrick”},
new MyItem(){ID=16,FirstName=“Ryan”},
};
var list2=新列表(){
new MyItem(){ID=5,FirstName=“John”,WorkingID=1},
new MyItem(){ID=9,FirstName=“Patrick”,WorkingID=2},
new MyItem(){ID=16,FirstName=“Ryan”,WorkingID=3},
};
var mergedList=来自列表1中的项目1
在列表2中加入item2
在item1.ID上等于item2.ID
选择new MyItem(){ID=item1.ID,FirstName=item1.FirstName,WorkingID=item2.WorkingID};

这里有一种方法,假设类结构如下:

class MyItem
{
    public int ID { get; set; }
    public string FirstName { get; set; }
    public int WorkingID { get; set; }
}
您可以加入匹配ID的第二个列表:

var list1 = new List<MyItem>() {
    new MyItem() { ID = 5, FirstName = "John" },
    new MyItem() { ID = 9, FirstName = "Patrick" },
    new MyItem() { ID = 16, FirstName = "Ryan" },
};

var list2 = new List<MyItem>() {
    new MyItem() { ID = 5, FirstName = "John", WorkingID = 1 },
    new MyItem() { ID = 9, FirstName = "Patrick", WorkingID = 2 },
    new MyItem() { ID = 16, FirstName = "Ryan", WorkingID = 3 },
};

var mergedList = from item1 in list1
                join item2 in list2
                on item1.ID equals item2.ID
                select new MyItem() { ID = item1.ID, FirstName = item1.FirstName, WorkingID = item2.WorkingID };
var list1=新列表(){
new MyItem(){ID=5,FirstName=“John”},
new MyItem(){ID=9,FirstName=“Patrick”},
new MyItem(){ID=16,FirstName=“Ryan”},
};
var list2=新列表(){
new MyItem(){ID=5,FirstName=“John”,WorkingID=1},
new MyItem(){ID=9,FirstName=“Patrick”,WorkingID=2},
new MyItem(){ID=16,FirstName=“Ryan”,WorkingID=3},
};
var mergedList=来自列表1中的项目1
在列表2中加入item2
在item1.ID上等于item2.ID
选择new MyItem(){ID=item1.ID,FirstName=item1.FirstName,WorkingID=item2.WorkingID};

我认为使用
Join
然后在列表中循环将更有效。以下内容与Florian Schmidinger提供的答案基本相同:

A.AsEnumerable().Join(B.AsEnumerable(), a => a.ID, b => b.ID, (a, b) => new { a, b })
    .ToList().ForEach(obj => { obj.a.WorkingID = obj.b.WorkingID; });

我认为使用
Join
然后在列表中循环将更有效率。以下内容与Florian Schmidinger提供的答案基本相同:

A.AsEnumerable().Join(B.AsEnumerable(), a => a.ID, b => b.ID, (a, b) => new { a, b })
    .ToList().ForEach(obj => { obj.a.WorkingID = obj.b.WorkingID; });

可能的副本可能的副本IEnumerable没有ForEach。这将导致语法错误这是相当整洁和简洁的IEnumerable没有ForEach。这将给出语法错误这是相当整洁和简洁的