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;
}
}
}
Terkadang Anda hanya perlu tahu apakah dua daftar itu berbeda, dan bukan apa perbedaannya. Dalam hal itu, pertimbangkan untuk menambahkan metode ekstensi ini ke proyek Anda. Perhatikan bahwa objek Anda yang terdaftar harus mengimplementasikan IEquatable!
Pemakaian:
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
}
Apa pun Component
kelasnya, metode yang ditunjukkan di sini Car
harus diimplementasikan hampir secara identik.
Sangat penting untuk mencatat bagaimana kami telah menulis GetHashCode. Untuk menerapkan dengan benar IEquatable
,Equals
dan GetHashCode
harus beroperasi pada properti instance dengan cara yang kompatibel secara logis.
Dua daftar dengan konten yang sama masih objek yang berbeda, dan akan menghasilkan kode hash yang berbeda. Karena kita ingin kedua daftar ini diperlakukan sama, kita harus membiarkan GetHashCode
menghasilkan nilai yang sama untuk masing-masingnya. Kita dapat melakukannya dengan mendelegasikan kode hash ke setiap elemen dalam daftar, dan menggunakan bitor XOR standar untuk menggabungkan semuanya. XOR adalah agnostik-urutan, jadi tidak masalah jika daftar diurutkan secara berbeda. Yang penting mereka hanya berisi anggota yang setara.
Catatan: nama yang aneh adalah untuk menyiratkan fakta bahwa metode ini tidak mempertimbangkan urutan elemen dalam daftar. Jika Anda peduli dengan urutan elemen dalam daftar, metode ini bukan untuk Anda!