我在程序中保存了两个列表-一个主列表和另一个正在不断更新的临时列表。临时列表经常会刷新到主列表中。

主列表是HashSet(用于无重复项),临时列表是List(用于建立索引功能)。我通过致电将后者冲洗到前者中

HashSet<T>.UnionWith(List<T>)


在测试中,我发现重复项已进入列表,但我认为这在HashSet中是不可能的。有人可以确认/纠正吗?我尚未在MSDN中找到它。

最佳答案

列表(用于索引功能)。


您需要字典来建立索引。
不过请注意,这是一个非常简单的程序,它说明了您的问题:

class Program
{
    static void Main(string[] args)
    {
        int totalCats = 0;
        HashSet<Cat> allCats = new HashSet<Cat>();
        List<Cat> tempCats = new List<Cat>();

        //put 10 cats in
        for (int i = 0; i < 10; i++)
        {
            tempCats.Add(new Cat(i));
            totalCats += 1;
        }

        //add the cats to the final hashset & empty the temp list
        allCats.UnionWith(tempCats);
        tempCats = new List<Cat>();

        //create 10 identical cats
        for (int i = 0; i < 10; i++)
        {
            tempCats.Add(new Cat(i));
            totalCats += 1;
        }

        //join them again
        allCats.UnionWith(tempCats);
        //print the result
        Console.WriteLine("Total cats: " + totalCats);
        foreach (Cat curCat in allCats)
        {
            Console.WriteLine(curCat.CatNumber);
        }
    }
}

public class Cat
{
    public int CatNumber { get; set; }
    public Cat(int catNum)
    {
        CatNumber = catNum;
    }
}


您的问题是您没有覆盖GetHashCode()和Equals()。您需要同时设置两个哈希值才能保持唯一性。

这将起作用,但是GetHashCode()函数应该更健壮。我建议阅读.NET的用法:

class Program
{
    static void Main(string[] args)
    {
        int totalCats = 0;
        HashSet<Cat> allCats = new HashSet<Cat>();
        List<Cat> tempCats = new List<Cat>();

        //put 10 cats in
        for (int i = 0; i < 10; i++)
        {
            tempCats.Add(new Cat(i));
            totalCats += 1;
        }

        //add the cats to the final hashset & empty the temp list
        allCats.UnionWith(tempCats);
        tempCats = new List<Cat>();

        //create 10 identical cats
        for (int i = 0; i < 10; i++)
        {
            tempCats.Add(new Cat(i));
            totalCats += 1;
        }

        //join them again
        allCats.UnionWith(tempCats);
        //print the result
        Console.WriteLine("Total cats: " + totalCats);
        foreach (Cat curCat in allCats)
        {
            Console.WriteLine(curCat.CatNumber);
        }
        Console.ReadKey();
    }
}

public class Cat
{
    public int CatNumber { get; set; }
    public Cat(int catNum)
    {
        CatNumber = catNum;
    }

    public override int GetHashCode()
    {
        return CatNumber;
    }

    public override bool Equals(object obj)
    {
        if (obj is Cat)
        {
            return ((Cat)obj).CatNumber == CatNumber;
        }
        return false;
    }
}

关于c# - 使用List <T>参数构造HashSet <T>时允许重复吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18019036/

10-10 18:27
查看更多