Efficient Methods for Updating Objects in List<T> in C# with Performance Analysis

Nov 20, 2025 · Programming · 17 views · 7.8

Keywords: C# | List<T> | Object Update | LINQ | Performance Optimization

Abstract: This article comprehensively explores various methods for updating objects in List<T> collections in C#, including LINQ queries, dictionary optimization, and handling differences between value types and reference types. Through performance comparisons and code examples, it analyzes the applicable scenarios of different methods to help developers choose optimal solutions based on actual requirements.

Introduction

In C# programming, List<T> is one of the most commonly used collection types, often requiring finding and updating objects based on specific properties. This article systematically introduces multiple implementation methods and analyzes their performance characteristics and applicable scenarios.

Basic Method: Using LINQ Queries

The most straightforward approach is using LINQ's FirstOrDefault method:

var obj = myList.FirstOrDefault(x => x.MyProperty == myValue);
if (obj != null) obj.OtherProperty = newValue;

This method is concise and clear, specifying search conditions through Lambda expressions and returning the first matching item or default value. Note that this method is suitable for reference types, while value types require special handling.

Performance Optimization: Using Dictionary Caching

When frequent searches are needed, converting the list to a dictionary can improve performance:

var dict = myList.ToDictionary(x => x.MyProperty);
MyObject found;
if (dict.TryGetValue(myValue, out found)) found.OtherProperty = newValue;

Dictionary lookup has O(1) time complexity, significantly better than linear search in lists, making it particularly suitable for scenarios requiring multiple queries.

Differences Between Value Types and Reference Types

When handling struct (value types), note that FirstOrDefault returns a copy, and modifications won't affect the original collection:

struct MyStruct
{
    public int TheValue { get; set; }
}

List<MyStruct> coll = new List<MyStruct> {
    new MyStruct {TheValue = 10},
    new MyStruct {TheValue = 1},
    new MyStruct {TheValue = 145}
};

var found = coll.FirstOrDefault(c => c.TheValue == 1);
found.TheValue = 12; // This won't update the original collection

For value types, modify directly through index:

var index = coll.FindIndex(c => c.TheValue == 1);
if (index != -1)
{
    var item = coll[index];
    item.TheValue = 12;
    coll[index] = item;
}

Built-in Method Comparison

C# provides multiple search methods, each with its characteristics:

Find method: Directly returns the matching object with best performance:

var book = Books.Find(b => b.ISBN == isbn);
if (book != null) book.IsCheckedOut = true;

FindIndex method: Returns index position, suitable for scenarios requiring positional information:

var index = Books.FindIndex(b => b.ISBN == isbn);
if (index != -1) Books[index].IsCheckedOut = true;

IndexOf method: Requires overriding the Equals method for proper object content comparison.

Performance Analysis

According to benchmark tests, the performance ranking of various methods is as follows:

SingleOrDefault has the highest performance overhead due to ensuring uniqueness.

Best Practice Recommendations

1. For single or few queries, use Find or FirstOrDefault

2. For frequent queries, consider using dictionary caching

3. Be cautious of copy issues when handling value types

4. Balance method selection based on performance requirements and code readability

5. Use SingleOrDefault in scenarios requiring uniqueness assurance

Conclusion

There are multiple methods for updating objects in List<T> in C#, each with its applicable scenarios. Developers should choose the most appropriate method based on specific performance requirements, data characteristics, and business needs. For most scenarios, the Find method provides the best balance of performance and code simplicity.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.