如何去除KeyValuePair中的重复数据?
How to remove duplicate data in KeyValuePair?
如何在调用AddTest
时删除重复数据,删除重复项(在添加到list
之前)??
需要添加 Contains,但如何使用 List 来添加?
private static List<KeyValuePair<byte[], string>> list = new List<KeyValuePair<byte[], string>>();
public static void AddTest(byte[] myarray, string test)
{
list.Add(new KeyValuePair<byte[], string>(myarray, test));
}
首先,我们应该达成共识:什么是重复的
KeyValuePair<byte[], string>
实例。假设 KeyValuePair<byte[], string>
个实例 x
和 y
是 重复的 当且仅当 Key
和 Value
都是相等,即
x.Key.SequenceEquals(y.Key) && x.Value == y.Value
我们可以实现所需的比较器:
public sealed class MyEquComparer : IEqualityComparer<KeyValuePair<byte[], string>> {
public bool Equals(KeyValuePair<byte[], string> x, KeyValuePair<byte[], string> y) =>
Enumerable.SequenceEqual(x.Key, y.Key) && string.Equals(x.Value, y.Value);
public int GetHashCode([DisallowNull] KeyValuePair<byte[], string> obj) =>
obj.Key == null ? 0 : obj.Key.Length;
}
然后使用比较器去除重复项:
private static List<KeyValuePair<byte[], string>> list =
new List<KeyValuePair<byte[], string>>();
private static HashSet<KeyValuePair<byte[], string>> unique = new
HashSet<KeyValuePair<byte[], string>>(new MyEquComparer());
public static void AddTest(byte[] myarray, string test)
{
// only if we're adding a unique item, we put it into the list
if (unique.Add(test))
list.Add(new KeyValuePair<byte[], string>(myarray, test));
}
考虑使用字典。如果字典已经包含键,它允许使用 TryAdd 不做任何事情(它也不会抛出异常)。
更多信息:Here
当您可以只使用 Dictionary 并将 T 确定为您的类型时,您到底为什么要使用 'List<KeyValuePair<byte[], string>>'?
您的部分问题是您没有使用适当的类型。列表不会阻止添加重复项。但是您可以做的是检查该列表以查看您要添加的键值对是否已经存在。尽管可以通过使用 TryAdd 方法将 List 切换为字典来防止整个问题。
TryAdd returns 如果 key/value 对已成功添加到字典中,则为真;否则,假的。微软说:
与 Add 方法不同,如果字典中存在具有给定键的元素,此方法不会引发异常。与字典索引器不同,如果字典中存在具有给定键的元素,TryAdd 不会覆盖该元素。如果密钥已经存在,TryAdd 什么都不做并且 returns false。
这样可以防止添加重复项。
可以在此处的文档中阅读更多信息:https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2?view=net-5.0
如何在调用AddTest
时删除重复数据,删除重复项(在添加到list
之前)??
需要添加 Contains,但如何使用 List 来添加?
private static List<KeyValuePair<byte[], string>> list = new List<KeyValuePair<byte[], string>>();
public static void AddTest(byte[] myarray, string test)
{
list.Add(new KeyValuePair<byte[], string>(myarray, test));
}
首先,我们应该达成共识:什么是重复的
KeyValuePair<byte[], string>
实例。假设 KeyValuePair<byte[], string>
个实例 x
和 y
是 重复的 当且仅当 Key
和 Value
都是相等,即
x.Key.SequenceEquals(y.Key) && x.Value == y.Value
我们可以实现所需的比较器:
public sealed class MyEquComparer : IEqualityComparer<KeyValuePair<byte[], string>> {
public bool Equals(KeyValuePair<byte[], string> x, KeyValuePair<byte[], string> y) =>
Enumerable.SequenceEqual(x.Key, y.Key) && string.Equals(x.Value, y.Value);
public int GetHashCode([DisallowNull] KeyValuePair<byte[], string> obj) =>
obj.Key == null ? 0 : obj.Key.Length;
}
然后使用比较器去除重复项:
private static List<KeyValuePair<byte[], string>> list =
new List<KeyValuePair<byte[], string>>();
private static HashSet<KeyValuePair<byte[], string>> unique = new
HashSet<KeyValuePair<byte[], string>>(new MyEquComparer());
public static void AddTest(byte[] myarray, string test)
{
// only if we're adding a unique item, we put it into the list
if (unique.Add(test))
list.Add(new KeyValuePair<byte[], string>(myarray, test));
}
考虑使用字典。如果字典已经包含键,它允许使用 TryAdd 不做任何事情(它也不会抛出异常)。
更多信息:Here
当您可以只使用 Dictionary
您的部分问题是您没有使用适当的类型。列表不会阻止添加重复项。但是您可以做的是检查该列表以查看您要添加的键值对是否已经存在。尽管可以通过使用 TryAdd 方法将 List
TryAdd returns 如果 key/value 对已成功添加到字典中,则为真;否则,假的。微软说:
与 Add 方法不同,如果字典中存在具有给定键的元素,此方法不会引发异常。与字典索引器不同,如果字典中存在具有给定键的元素,TryAdd 不会覆盖该元素。如果密钥已经存在,TryAdd 什么都不做并且 returns false。
这样可以防止添加重复项。 可以在此处的文档中阅读更多信息:https://docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2?view=net-5.0