Reputation: 1042
I have two lists:
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
I want to compare these lists using LINQ and if IDs from both lists are equal, I want to set WorkingID in the first list, A list. Thanks.
Upvotes: 1
Views: 3616
Reputation: 692
I think using Join
then looping through the list would be more efficient. The below is practically the same as the answer provided by 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; });
Upvotes: 1
Reputation: 63
Here is one way, assuming a class structure as follows:
class MyItem
{
public int ID { get; set; }
public string FirstName { get; set; }
public int WorkingID { get; set; }
}
You can join the second list on matching IDs:
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 };
Upvotes: 1
Reputation: 56449
Try this:
listA.Where(a => listB.Any(b => a.ID == b.ID))
.ToList()
.ForEach(a => a.WorkingID = listB.First(b => b.ID == a.ID).WorkingID);
Upvotes: 3
Reputation: 35790
Also like this:
A.ForEach(c => c.WorkingID = B.Where(m => m.ID == c.ID).Select(s => s.WorkingID).FirstOrDefault());
Full source:
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());
}
}
Upvotes: 5
Reputation: 53958
You could try something like this (not a pure LINQ approach):
foreach(var item in listA)
{
var itemInB = listB.FirstOrDefault(x=>x.ID==item.ID);
if(itemInB!=null)
item.WorkingID = itemInB.WorkongID
}
Upvotes: 2
Reputation: 4692
var query = from a in lista
join b in listb on a.ID equals b.ID
where b.WorkingID != null
select new {a, b};
foreach (var item in query)
{
item.a.WorkingID = item.b.WorkingID;
}
easy as that.
Upvotes: 1