न आप Dictionary
निर्माता कि IEqualityComparer<T>
में ले जाता है का उपयोग नहीं कर रहे हैं और आप पर कस्टम समानता लागू किए गए हों Employee
कक्षा।
तो अभी शब्दकोश शब्दकोश संदर्भ के अनुसार कर्मचारियों की तुलना कर रहा है। जब आप new
कर्मचारी होते हैं, तो आपके पास अलग-अलग संदर्भ है, भले ही उदा। नाम वही हो सकता है।
शायद आपके सबसे आसान तरीका आपके IEqualityComparer<Employee>
को लागू करना होगा, जहां आप चुन सकते हैं कि कौन से सदस्यों को समानता तुलना के लिए उपयोग किया जाएगा, और इसे शब्दकोश के निर्माता के पास पास कर दिया जाएगा।
[संपादित करें] के रूप में वादा किया था, के टुकड़े:
//ReSharper's courtesy
public sealed class NameAgeEqualityComparer : IEqualityComparer<Employee>
{
public bool Equals(Employee x, Employee y)
{
if (ReferenceEquals(x, y)) return true;
if (ReferenceEquals(x, null)) return false;
if (ReferenceEquals(y, null)) return false;
if (x.GetType() != y.GetType()) return false;
return string.Equals(x.Name, y.Name) && x.Age == y.Age;
}
public int GetHashCode(Employee obj)
{
unchecked
{
return ((obj.Name != null ? obj.Name.GetHashCode() : 0) * 397)^obj.Age;
}
}
}
और फिर:
var employeeSalaryDictionary = new Dictionary<Employee, int>(new NameAgeEqualityComparer());
employeeSalaryDictionary.Add(new Employee { Name = "Chuck", Age = 37 }, 1000);
employeeSalaryDictionary.Add(new Employee { Name = "Norris", Age = 37 }, 2000);
employeeSalaryDictionary.Add(new Employee { Name = "Rocks", Age = 44 }, 3000);
Employee employeeToFind = new Employee { Name = "Chuck", Age = 37 };
bool exists = employeeSalaryDictionary.ContainsKey(employeeToFind); // true!
पूर्णता के लिए, यहाँ-नाम ही comparer (भी ReSharper के सौजन्य से) है:
public sealed class NameEqualityComparer : IEqualityComparer<Employee>
{
public bool Equals(Employee x, Employee y)
{
if (ReferenceEquals(x, y)) return true;
if (ReferenceEquals(x, null)) return false;
if (ReferenceEquals(y, null)) return false;
if (x.GetType() != y.GetType()) return false;
return string.Equals(x.Name, y.Name);
}
public int GetHashCode(Employee obj)
{
return (obj.Name != null ? obj.Name.GetHashCode() : 0);
}
}
लेकिन, जैसा कि आपने देखा है, आपको यह तय करना होगा कि जब आप एक शब्दकोश बनाते हैं तो आप तुलनात्मक कुंजी के लिए किस तुलनात्मक का उपयोग करेंगे। इसे बाद में बदला नहीं जा सकता ...
आपको अपने कर्मचारी वर्ग –
के लिए समानताएं और GetHashCode ओवरराइड करना चाहिए, मुझे लगता है कि वस्तुओं की तुलना करने के तरीके के साथ कुछ करना है। चूंकि शब्दकोश में ऑब्जेक्ट्स और 'कर्मचारी टॉफ़िंड' में वस्तुएं वास्तव में अलग-अलग ऑब्जेक्ट्स हैं - उन्हें तुलना करने से तुलनात्मक रूप से झूठी –