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;
}
}
}
कभी-कभी आपको केवल यह जानने की आवश्यकता होती है कि क्या दो सूचियाँ अलग हैं, और न कि वे अंतर क्या हैं। उस स्थिति में, इस विस्तार विधि को अपनी परियोजना में जोड़ने पर विचार करें। ध्यान दें कि आपकी सूचीबद्ध वस्तुओं को IEquatable को लागू करना चाहिए!
उपयोग:
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
}
जो भी Componentवर्ग है, उसके लिए यहां दिखाए गए तरीकों Carको लगभग समान रूप से लागू किया जाना चाहिए।
यह ध्यान रखना बहुत ज़रूरी है कि हमने GetHashCode को कैसे लिखा है। ठीक से लागू करने के लिए IEquatable, Equalsऔर एक तार्किक रूप से उदाहरण के गुणों पर काम GetHashCode करना चाहिए ।
समान सामग्री वाली दो सूचियां अभी भी अलग-अलग ऑब्जेक्ट हैं, और अलग-अलग हैश कोड का उत्पादन करेंगी। चूंकि हम चाहते हैं कि इन दोनों सूचियों को समान माना जाए, इसलिए हमें GetHashCodeउनमें से प्रत्येक के लिए समान मूल्य का उत्पादन करने देना चाहिए । हम सूची में हर तत्व को हैशकोड सौंपकर, और उन सभी को संयोजित करने के लिए मानक बिटवाइड XOR का उपयोग करके इसे पूरा कर सकते हैं। XOR ऑर्डर-अज्ञेयवादी है, इसलिए यह कोई फर्क नहीं पड़ता कि सूचियों को अलग-अलग क्रमबद्ध किया गया है। यह केवल मायने रखता है कि उनके पास समतुल्य सदस्यों के अलावा कुछ नहीं है।
नोट: अजीब नाम इस तथ्य का अर्थ है कि विधि सूची में तत्वों के आदेश पर विचार नहीं करती है। यदि आप सूची में तत्वों के क्रम के बारे में परवाह करते हैं, तो यह विधि आपके लिए नहीं है!