防止将具有相同 byte[] 键的两个项目添加到 KeyedCollection<byte[], MyObject>
Posted
技术标签:
【中文标题】防止将具有相同 byte[] 键的两个项目添加到 KeyedCollection<byte[], MyObject>【英文标题】:Prevent adding two items with the same byte[] key in from being added to a KeyedCollection<byte[], MyObject> 【发布时间】:2022-01-01 12:22:33 【问题描述】:代码:
public class Coll : KeyedCollection<byte[], MyObject>
protected override byte[] GetKeyForItem(MyObject item) => item.Key;
public class EquComparer : IEqualityComparer<byte[]>
public bool Equals(byte[]? x, byte[]? y)
if (x is null && y is null) return true;
if (x is null) return false;
if (y is null) return false;
return x.SequenceEqual(y);
public int GetHashCode([DisallowNull] byte[] obj)
int result = Int32.MinValue;
foreach (var b in obj)
result += b;
return result;
我的密钥是byte[]
。我想设置默认相等比较器以使用 byte[]::SequenceEqual()
将键与某物进行比较,以防止添加具有相同键的两个项目。
有没有办法做到这一点?
编辑: 正如其他人指出的那样,我可以使用构造函数来指定非默认相等比较器。我确信它会在某个时候被遗忘,从而导致难以找到的错误。这就是为什么我想在类中添加一些代码,使我的自定义相等比较器成为该类的默认值。
【问题讨论】:
忽略其他一切,您尝试过使用比较器的构造函数吗?public Coll():base(new EquComparer())
?
"使我的自定义相等比较器成为该类的默认值。" - 但是你想成为“默认”的类是byte[]
- 一个内置的生成类型,它对你的代码一无所知,不应该在你的进程中开始表现不同的everywhere(例如使用此类数组的库方法)
【参考方案1】:
KeyedCollection<TKey,TItem>
类有一个constructor,它接受一个IEqualityComparer<TKey>
。您可以在实例化派生类时调用此构造函数:
public class Coll : KeyedCollection<byte[], MyObject>
public Coll() : base(new EquComparer())
protected override byte[] GetKeyForItem(MyObject item) => item.Key;
【讨论】:
这就是答案。谢谢!以上是关于防止将具有相同 byte[] 键的两个项目添加到 KeyedCollection<byte[], MyObject>的主要内容,如果未能解决你的问题,请参考以下文章