2011-04-28 7 views
6
var a = new double[] {1, 2, 3}; 
var b = new double[] {1, 2, 3}; 
System.Console.WriteLine(Equals(a, b)); // Returns false 

हालांकि, मैं उन सरणी की तुलना करने का एक तरीका ढूंढ रहा हूं जो संदर्भों के बजाय आंतरिक मानों की तुलना करेंगे। क्या .NET में ऐसा करने का कोई तरीका है?समानता के लिए .NET परीक्षण सरणी और केवल समान संदर्भ नहीं कर सकते हैं?

इसके अलावा, जबकि मैं Equals संदर्भों की तुलना में समझता हूं, GetHashCode इन दो सरणीओं के लिए अलग-अलग मान देता है, जो मुझे नहीं लगता है, क्योंकि उनके पास समान आंतरिक मान हैं।

+1

'गेटहाशकोड' अलग-अलग मान देता है क्योंकि वे अलग-अलग वस्तुएं हैं और इसलिए दोनों को एक शब्दकोश या हैशटेबल में चाबियों के रूप में उपयोग किया जा सकता है - इसलिए उन्हें आदर्श रूप से अलग-अलग बाल्टी में रखा जाना चाहिए। – Justin

उत्तर

7

मुझे विश्वास है कि आप Enumerable.SequenceEqual<TSource>(IEnumerable<TSource>, IEnumerable<TSource>) विधि की तलाश में हैं।

var a = new double[] {1, 2, 3}; 
var b = new double[] {1, 2, 3}; 
System.Console.WriteLine(a.SequenceEqual(b)); // Returns true 

जहां तक ​​GetHashCode विभिन्न मानों को वापस करने के साथ समस्या है, याद रखें कि आप यहां दो अलग-अलग मानों से निपट रहे हैं। आप सरणी की तुलना नहीं कर रहे हैं, आप सरणी के दो संदर्भों की तुलना कर रहे हैं।

संदर्भ प्रकारों के लिए डिफ़ॉल्ट समानता तुलना लगातार होना आवश्यक है। अगर आपको कुछ और करने की ज़रूरत है तो याद रखें कि IEqualityComparer<T> का उपयोग करके उस मॉडल में एक निर्मित मॉडल है जो आपको मानक संदर्भ समानता पैटर्न का पालन नहीं करने वाली विशिष्ट आवश्यकताओं के आधार पर कस्टम समानता तुलना को परिभाषित करने की अनुमति देता है।

5

अद्यतन: सही तुलना विधि का उपयोग करने के लिए फिक्स्ड कोड (@ संकेतों को इंगित करने के लिए @CodesInChaos के लिए धन्यवाद)।

IStructuralEquatable c = b; 
Console.WriteLine(c.Equals(a, StructuralComparisons.StructuralEqualityComparer)); 

यह question और अधिक विस्तार किया है:

आप .NET 4 में हैं, तो आप IStructuralEquatable इंटरफ़ेस का उपयोग कर सकते हैं।

+0

धन्यवाद, 'स्ट्रक्चरल कॉम्पैरिसन। स्ट्रक्चरल एक्वालिटी कॉम्पैयर.इक्वाल्स (ए, बी)' जो मैं खोज रहा था (जहां 'ए' और' बी 'प्रकार' सिस्टम 'हैं।')। – EM0

संबंधित मुद्दे