Update All Objects in a Collection Using Linq

Update all objects in a collection using LINQ

While you can use a ForEach extension method, if you want to use just the framework you can do

collection.Select(c => {c.PropertyToSet = value; return c;}).ToList();

The ToList is needed in order to evaluate the select immediately due to lazy evaluation.

Update a List's object using Linq

You cannot replace the value in the list using LINQ, because LINQ is a projection of a collection.

You can get your item and then find it in the list using IndexOf:

var item = Items.Single(i => i.Code == line.Code);
int index = Items.IndexOf(item);
Items[index] = new Item(); // replace the value

However, this approach is far from optimal in terms of algorithmic complexity, because it has to read through your list multiple times.

You can try to read more on Dictionary to find, add or replace items by key (in your case, Code) efficiently.

Update one object in collection using LINQ

Try this

var customListItem2 = myObject.myCollection.Where(a => a.Id == Id).FirstOrDefault();
var index = myObject.myCollection.IndexOf(customListItem2);

if(index != -1)
myObject.myCollection[index] = newCustomListItem;

Add, Update, Remove between collections using Linq

You can use the except and intersect methods to accomplish most of what you are looking to do.

However, depending on the size of your objects this can be very resource intensive.

I would recommend the following.

var listIDsA = collectionA.Select(s => s.Id).Distinct().ToList();

var listIDsB = collecitonB.Select(s => s.Id).Distinct().ToList();

var idsToRemove = listIDsB.Select (s => !listIDsA.Contains(s.Id)).ToList();

var idsToUpdate = listIDsB.Select(s => listIDsA.Contains(s.Id)).ToList();

var idsToAdd = listIDsA.SelecT(s => !listIDsB.Contains(s.Id)).ToList();

Then using the three new collections you can add/remove/update the apporpriate records.

You can also use a hashedset instead of IEnumerables for better performance. This will require you to create an extension class to add that functionality. Here is a good explanation of how to do that (it's not complicated).

How to convert linq results to HashSet or HashedSet

If you do this, you will need to replace the .ToList() in the first two lines to .ToHasedSet()

Update value of a property using LINQ

You have to use a foreach(at least that is the common and most efficient approach).

var toUpdate = offersVM.Offers.Where(x=> x.Provider.ProviderCode.Contains("p10"));

foreach(var x in toUpdate)
x.ProviderType = ProviderType.Default;

Use LINQ to query a datasource, not to modify it!

Update all objects except one in a collection using Linq

You can use .ForEach to make the change, and .Single to verify only one element matches the condition:

// make sure only one item matches the condition
var singleOne = collection.Single(c => c.Condition == condition);
singleOne.PropertyToSet = value;

// update the rest of the items
var theRest = collection.Where(c => c.Condition != condition);
theRest.ToList().ForEach(c => c.PropertyToSet = otherValue);

How to update an item in a List using LINQ

Do you mean something like this

List.Where(x => x.Amount>0).OrderBy(x => x.Id).FirstOrDefault()?.Amount += (item1- item2);

How to update a single item of liist of objects using LINQ in C#

The 'Q' in LINQ stands for "Query". LINQ is not meant to update objects.

You can use LINQ to find the object you want to update and then update it "traditionally".

var toUpdate = _seasons.Single(x => x.Text == "ALL");

toUpdate.ValueSelected = true;

This code assumes that there is exactly one entry with Text == "ALL". This code will throw an exception if there is none or if there are multiple.

If there is either none or one, use SingleOrDefault:

var toUpdate = _seasons.SingleOrDefault(x => x.Text == "ALL");

if(toUpdate != null)
toUpdate.ValueSelected = true;

If it's possible that there are multiple, use Where:

var toUpdate = _seasons.Where(x => x.Text == "ALL");

foreach(var item in toUpdate)
item.ValueSelected = true;


Related Topics



Leave a reply



Submit