防止将具有相同 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&lt;TKey,TItem&gt; 类有一个constructor,它接受一个IEqualityComparer&lt;TKey&gt;。您可以在实例化派生类时调用此构造函数:

public class Coll : KeyedCollection<byte[], MyObject>

    public Coll() : base(new EquComparer())  

    protected override byte[] GetKeyForItem(MyObject item) => item.Key;

【讨论】:

这就是答案。谢谢!

以上是关于防止将具有相同 byte[] 键的两个项目添加到 KeyedCollection<byte[], MyObject>的主要内容,如果未能解决你的问题,请参考以下文章

已添加具有相同键的项目

将一行中的金额添加到具有相同主键的不同行中的金额

为啥 WCF/Mongo 抛出异常:已添加具有相同键的项目

解决错误 - “返回 404 时已添加具有相同键的项目”

反应警告:flattenChildren(...):遇到两个具有相同键的孩子,`.$index`

已添加具有相同键的实体框架核心 3.1.6 项