Merging Two Object Lists Using LINQ
In scenarios like managing data, you may encounter situations where you need to combine multiple object lists. Let's consider a specific instance where we have two lists of Person objects:
<br>class Person<br>{</p> <div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:php;toolbar:false">string Name; int Value; int Change;
}
List
List
Our goal is to merge these two lists into a new List
Using the Linq Union Method
One simple approach to merge these lists is by using the Linq extension method Union. This method combines the elements of two sequences and returns a new sequence. For example:
<br>var mergedList = list1.Union(list2).ToList();<br>
By default, the Union method uses the Equals and GetHashCode methods of the Person class to determine duplicate elements. However, if you want to compare persons based on a specific property, such as their Name, you can override these methods in the Person class.
/// <summary> /// Checks if the provided object is equal to the current Person /// </summary> /// <param name="obj">Object to compare to the current Person</param> /// <returns>True if equal, false if not</returns> public override bool Equals(object obj) { // Try to cast the object to compare to to be a Person var person = obj as Person; return Equals(person); } /// <summary> /// Returns an identifier for this instance /// </summary> public override int GetHashCode() { return Name.GetHashCode(); } /// <summary> /// Checks if the provided Person is equal to the current Person /// </summary> /// <param name="personToCompareTo">Person to compare to the current person</param> /// <returns>True if equal, false if not</returns> public bool Equals(Person personToCompareTo) { // Check if person is being compared to a non person. In that case always return false. if (personToCompareTo == null) return false; // If the person to compare to does not have a Name assigned yet, we can't define if it's the same. Return false. if (string.IsNullOrEmpty(personToCompareTo.Name) return false; // Check if both person objects contain the same Name. In that case they're assumed equal. return Name.Equals(personToCompareTo.Name); }
Alternatively, you can create a comparer class that implements the IEqualityComparer interface to define your own comparison criteria. You can then specify this comparer as the second parameter in the Union method.
The above is the detailed content of How Can I Merge Two Lists of Person Objects Using LINQ, Handling Duplicates by Combining Values and Calculating Change?. For more information, please follow other related articles on the PHP Chinese website!