防止将具有相同 byte[] 键的两个项目添加到 KeyedCollection<byte[], MyObject>
Prevent adding two items with the same byte[] key in from being added to a KeyedCollection<byte[], MyObject>
代码:
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()
的东西进行比较,以防止添加具有相同键的两个项目。
有办法吗?
编辑: 正如其他人指出的那样,我可以使用构造函数来指定非默认相等比较器。我敢肯定它会在某个时候被遗忘,从而导致很难找到的错误。这就是为什么我想向 class 添加一些代码,使我的自定义相等比较器成为 class.
的默认值
KeyedCollection<TKey,TItem>
class 有一个接受 IEqualityComparer<TKey>
的 constructor。您可以在实例化派生的 class:
时调用此构造函数
public class Coll : KeyedCollection<byte[], MyObject>
{
public Coll() : base(new EquComparer()) { }
protected override byte[] GetKeyForItem(MyObject item) => item.Key;
}
代码:
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()
的东西进行比较,以防止添加具有相同键的两个项目。
有办法吗?
编辑: 正如其他人指出的那样,我可以使用构造函数来指定非默认相等比较器。我敢肯定它会在某个时候被遗忘,从而导致很难找到的错误。这就是为什么我想向 class 添加一些代码,使我的自定义相等比较器成为 class.
的默认值KeyedCollection<TKey,TItem>
class 有一个接受 IEqualityComparer<TKey>
的 constructor。您可以在实例化派生的 class:
public class Coll : KeyedCollection<byte[], MyObject>
{
public Coll() : base(new EquComparer()) { }
protected override byte[] GetKeyForItem(MyObject item) => item.Key;
}