Вам не нужно создавать свой собственный словарь - вам нужно создать собственную реализацию IEqualityComparer<T>
, которая использует идентичность как для хеширования, так и для равенства.Я не думаю такая вещь существует в рамках, но это достаточно легко построить из-за RuntimeHelpers.GetHashCode
.
public sealed class IdentityEqualityComparer<T> : IEqualityComparer<T>
where T : class
{
public int GetHashCode(T value)
{
return RuntimeHelpers.GetHashCode(value);
}
public bool Equals(T left, T right)
{
return left == right; // Reference identity comparison
}
}
Я ограничилT
будет ссылочным типом, так что в итоге вы получите объектов в словаре;если вы используете это для типов значений, вы можете получить некоторые странные результаты.(Я не знаю, как это будет работать; я подозреваю , что не получится.)
С этим все остальное легко.Например:
Dictionary<string, int> identityDictionary =
new Dictionary<string, int>(new IdentityEqualityComparer<string>());