using System.Collections.Generic;
using System.Linq;
namespace YourProject.Extensions
{
public static class ListExtensions
{
public static bool SetwiseEquivalentTo<T>(this List<T> list, List<T> other)
where T: IEquatable<T>
{
if (list.Except(other).Any())
return false;
if (other.Except(list).Any())
return false;
return true;
}
}
}
Đôi khi bạn chỉ cần biết nếu hai danh sách là khác nhau, và không phải những khác biệt đó là gì. Trong trường hợp đó, hãy xem xét thêm phương thức mở rộng này vào dự án của bạn. Lưu ý rằng các đối tượng được liệt kê của bạn nên triển khai IEquitable!
Sử dụng:
public sealed class Car : IEquatable<Car>
{
public Price Price { get; }
public List<Component> Components { get; }
...
public override bool Equals(object obj)
=> obj is Car other && Equals(other);
public bool Equals(Car other)
=> Price == other.Price
&& Components.SetwiseEquivalentTo(other.Components);
public override int GetHashCode()
=> Components.Aggregate(
Price.GetHashCode(),
(code, next) => code ^ next.GetHashCode()); // Bitwise XOR
}
Dù Component
lớp học là gì, các phương thức hiển thị ở đây Car
nên được thực hiện gần như giống hệt nhau.
Điều rất quan trọng cần lưu ý là chúng tôi đã viết GetHashCode như thế nào. Để thực hiện đúng IEquatable
, Equals
và GetHashCode
phải hoạt động trên tài sản của ví dụ trong một cách tương thích một cách logic.
Hai danh sách có cùng nội dung vẫn là các đối tượng khác nhau và sẽ tạo ra các mã băm khác nhau. Vì chúng tôi muốn hai danh sách này được coi là bằng nhau, chúng tôi phải cho phép GetHashCode
tạo ra cùng một giá trị cho mỗi danh sách. Chúng ta có thể thực hiện điều này bằng cách ủy thác mã băm cho mọi thành phần trong danh sách và sử dụng XOR bitwise tiêu chuẩn để kết hợp tất cả chúng. XOR không theo thứ tự, vì vậy sẽ không có vấn đề gì nếu các danh sách được sắp xếp khác nhau. Nó chỉ quan trọng rằng họ không chứa gì ngoài các thành viên tương đương.
Lưu ý: tên lạ là ngụ ý thực tế là phương thức không xem xét thứ tự của các phần tử trong danh sách. Nếu bạn quan tâm đến thứ tự của các yếu tố trong danh sách, phương pháp này không dành cho bạn!