C# 哈希列表集
本文关键字:列表 哈希 | 更新日期: 2023-09-27 18:34:28
我对C#很陌生,我有一个关于HashSets的问题。我已经使用它们从列表中获取唯一值,但现在我正在尝试将它们与嵌套列表一起使用。我有一个列表列表(每个列表包含 2 个数字(,我想提取唯一的数字对
例如,我有一些面板。对于每一个,我将它们的尺寸(长度宽度(放入一个列表中,并将该列表放入另一个列表中,所以我有这样的东西:[ [10,5], [10,6], [10,5],[10,7], [10,7] ]我想要的是提取唯一的信息对,以便我有:[ [10,5], [10,6], [10,7]
]我将如何去做
你可以让另一个类为你做这件事,或者使用 lambda 表达式处理它,并将你的 List 转换为 HashSet...以及如何:)...对于第一种方法,.net中有一个名为IEqualityComparer的接口。您可以在自定义类中实现此接口,如下所示:
class ListEqCompare : IEqualityComparer<List<int>>
{
public bool Equals(List<int> x, List<int> y)
{
if (x.Count != y.Count)
return false;
for (int i = 0; i < x.Count; i++)
{
if (x[i] != y[i])
return false;
}
return true;
}
public int GetHashCode(List<int> obj)
{
int hash = 0;
foreach (int num in obj)
hash = hash ^ EqualityComparer<int>.Default.GetHashCode(num);
return hash;
}
}
在此类中,每个列表的哈希值是使用列表中所有数字的哈希值的异或计算的...您可以使用其他方法,例如加法,乘法等,具体取决于问题的域。一旦哈希准备就绪并且两个对象具有相同的哈希值,Equals(( 函数就会扮演角色并比较列表......最后,您可以通过以下方式使用您的类:
var newList = list.Distinct(new ListEqCompare());
另一种方法是将列表转换为哈希集,并使用哈希集的现有函数比较它们...
var newList = list.Select(x => new HashSet<int>(x))
.Distinct(HashSet<int>.CreateSetComparer()).ToList();
考虑使用Tuple<T1, T2>
对象列表而不是列表列表。 使用 Tuple
的优点是,它可以确保列表中的所有元素都包含相同数量的子元素,并且可以防止它们在创建后被修改。
首先,由于您在子列表中仅存储 2 个值,因此您可以使用 KeyValuePair 结构来存储数据。然后你可以这样做:
var initialList = new List<KeyValuePair<int, int>>();
var listOfDistinctItems = new List<KeyValuePair<int, int>>();
//populate initial list ...
foreach(var item in initialList)
{
if (listOfDistinctItems.Exists(di => di.Key == item.Key && di.Value == item.Value))
continue;
listOfDistinctItems.Add(item);
}