आप .NET 4.0 का उपयोग कर रहे हैं, तो आप में
var tuple = new Tuple<int, int>(17, 42);
var otherTuple = Tuple.Create(17, 42);
और
var list = new List<Tuple<int, int>>();
नोट के रूप में Tuple
वर्ग इस्तेमाल कर सकते हैं कि अगर आप Tuple<int, int>
का उपयोग करने का तरीका अपनाते हैं तो आप की आवश्यकता होगी को (y, x)
के बराबर माना जाने वाला आपके समानता नियमों को दर्शाने के लिए IEqualityComparer<Tuple<TFirst, TSecond>>
का एक कस्टम कार्यान्वयन तैयार करने के लिए। इसके बाद आपको इस तुलनात्मक के उदाहरण को List<T>.Contains(T, IEqualityComparer<T>)
पर पास करना होगा (यहां T
आपके लिए Tuple<int, int>
है)।
class TupleAsUnorderedPairComparer : IEqualityComparer<Tuple<TFirst, TSecond>> {
public bool Equals(Tuple<TFirst, TSecond> x, Tuple<TFirst, TSecond> y) {
if(Object.ReferenceEquals(x, y)) {
return true;
}
if(x == null || y == null) {
return false;
}
return x.Item1 == y.Item1 && x.Item2 == y.Item2 ||
x.Item1 == y.Item2 && x.Item2 == y.Item1;
}
public int GetHashCode(Tuple<TFirst, TSecond> x) {
if(x == null) {
return 0;
}
return x.Item1.GetHashCode()^x.Item2.GetHashCode();
}
}
अन्यथा, आप नहीं कर सकते हैं या नहीं Tuple
उपयोग करना चाहते हैं तो आप अपने Pair
वर्ग के लिए एक IEqualityComparer<Pair>
लागू करने या Object.Equals
और Object.GetHashCode
ओवरराइड करने के लिए की आवश्यकता होगी।
class Pair {
public int First { get; private set; }
public int Second { get; private set; }
public Pair(int first, int second) {
this.First = first;
this.Second = second;
}
public override bool Equals(object obj) {
if(Object.ReferenceEquals(this, obj)) {
return true;
}
Pair instance = obj as Pair;
if(instance == null) {
return false;
}
return this.First == instance.First && this.Second == instance.Second ||
this.First == instance.Second && this.Second == instance.First;
}
public override int GetHashCode() {
return this.First.GetHashCode()^this.Second.GetHashCode();
}
}
और
class PairEqualityComparer : IEqualityComparer<Pair> {
// details elided
}
आप उपयोग
list.Contains(pair);
तो यह Equals
और GetHashCode
का उपयोग करेगा, लेकिन यदि आप
list.Contains(pair, new PairEqualityComparer);
का उपयोग तो यहका उपयोग करेगा तोऔर PairEqualityComparer.GetHashCode
। ध्यान दें कि ये Object.Equals
और Object.GetHashCode
के कार्यान्वयन से अलग हो सकते हैं।
अंत में, अगर रोकथाम के लिए परीक्षण ऐसा कुछ है जो आप अक्सर करेंगे तो List
आपकी सबसे अच्छी शर्त नहीं है; आपको HashSet
जैसे उस उद्देश्य के लिए डिज़ाइन की गई कक्षा का उपयोग करना चाहिए।
मैंने '(x, y) 'के लिए आपकी आवश्यकता को प्रतिबिंबित करने के लिए मेरा उत्तर संपादित किया गया है जिसे' (y, x) 'के बराबर माना जा सकता है। – jason