Sid Brooklyn
Sid Brooklyn

Reputation: 1042

How to set a value in one list when comparing it with other list using LINQ

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

Answers (6)

Richard Mneyan
Richard Mneyan

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

Mike Watkins
Mike Watkins

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

Mathew Thompson
Mathew Thompson

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

Giorgi Nakeuri
Giorgi Nakeuri

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

Christos
Christos

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

Florian Schmidinger
Florian Schmidinger

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

Related Questions