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]

]

我将如何去做

C# 哈希列表集

你可以让另一个类为你做这件事,或者使用 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);
            }