अलोहा,HashSet <T> .RemoveWhere() और GetHashCode()
यहाँ एक सरल वर्ग कि GetHashCode ओवरराइड करता है है अपने पाठ संपत्ति बदलने के लिए, इस तरह:
var hashset = new HashSet<OverridesGetHashCode>();
var oghc = new OverridesGetHashCode { Text = "1" };
hashset.Add(oghc);
oghc.Text = "2";
तो यह काम नहीं करता:
var removedCount = hashset.RemoveWhere(c => ReferenceEquals(c, oghc));
// fails, nothing is removed
Assert.IsTrue(removedCount == 1);
और न करता है:
// this line works, i.e. it does find a single item matching the predicate
var existing = hashset.Single(c => ReferenceEquals(c, oghc));
// but this fails; nothing is removed again
var removed = hashset.Remove(existing);
Assert.IsTrue(removed);
मैं हैश वह आंतरिक रूप से उपयोग करता है जब आइटम डाला जाता है और, कि अगर सच है, यह समझ में आता है कि hashset.Contains (oghc) काम नहीं करता है उत्पन्न होता है लगता है। मुझे यह भी लगता है कि यह अपने हैश कोड द्वारा आइटम को देखता है और यदि यह एक मैच पाता है, तो केवल यह भविष्यवाणी की जांच करता है, और यही कारण है कि पहला परीक्षण विफल रहता है (फिर से, मैं बस अनुमान लगा रहा हूं)। लेकिन अंतिम परीक्षण क्यों विफल रहता है, मुझे बस उस ऑब्जेक्ट को हैशसेट से बाहर मिला है? क्या मुझे कुछ याद आ रहा है, क्या हैशसेट से कुछ निकालने का यह गलत तरीका है?
इसे पढ़ने के लिए समय निकालने के लिए धन्यवाद।
अद्यतन: भ्रम से बचने के लिए, यहाँ बराबर() है:
protected bool Equals(OverridesGetHashCode other)
{
return string.Equals(Text, other.Text);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((OverridesGetHashCode) obj);
}
आपको शायद एरिक लिपर्ट के [दिशानिर्देश और GetHashCode के नियम] (http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for- gethashcode.aspx) विशेष रूप से नियम * GetHashCode द्वारा लौटाया गया पूर्णांक कभी भी परिवर्तित नहीं होना चाहिए, जबकि ऑब्जेक्ट डेटा संरचना में निहित है जो हैश कोड शेष स्थिर * पर निर्भर करता है। –
मैंने पहली बार सोचा कि यह एक अच्छा सवाल था, अब मुझे लगता है जैसे मैंने कुछ सचमुच बेवकूफ पूछा :) यह सब थोड़ी देर के बाद समझ में आता है, यह पहले पहले काउंटर-सहज महसूस करता था। 'मैंने कभी भी हैशसेट का उपयोग नहीं किया' सबसे अच्छा बहाना है जिसके साथ मैं आ सकता हूं: डी धन्यवाद सब। –