呼叫時如何洗掉重復資料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));
}
uj5u.com熱心網友回復:
首先,我們應該達成協議:什么是重復的
KeyValuePair<byte[], string>
實體。假設KeyValuePair<byte[], string>實體x和y 是重復的當且僅當Keys 和Values 相等,即
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));
}
uj5u.com熱心網友回復:
考慮使用字典。如果字典已經包含密鑰,它允許使用 TryAdd 不做任何事情(它也不會拋出例外)。
更多資訊:這里
uj5u.com熱心網友回復:
當您可以使用 Dictionary<T,T> 來確定 T 作為您的型別時,您到底為什么要使用“List<KeyValuePair<byte[], string>>”?
您的部分問題是您沒有使用適當的型別。串列不會阻止添加重復項。但是您可以做的是檢查該串列以查看您添加的鍵值對是否已經存在。盡管可以通過使用 TryAdd 方法為字典切換 List<T,T> 來防止整個問題。
如果鍵/值對成功添加到字典中,TryAdd 回傳 true;否則為假。微軟說:
與 Add 方法不同,如果字典中存在具有給定鍵的元素,則此方法不會引發例外。與字典索引器不同,如果具有給定鍵的元素存在于字典中,TryAdd 不會覆寫該元素。如果鍵已經存在,TryAdd 什么都不做并回傳 false。
這將防止您添加重復的專案。更多資訊可以在檔案中閱讀更多資訊:https : //docs.microsoft.com/en-us/dotnet/api/system.collections.generic.dictionary-2? view = net- 5.0
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/311502.html
下一篇:串列理解中的不變變數
