C# 嵌套列表集?

C# 嵌套列表集?,c#,list,nested,hashset,C#,List,Nested,Hashset,我正在处理一个project Euler问题,我想采用创建一个值列表的方法,并将该列表添加到哈希集中,这样,如果列表已经存在于哈希集中,我可以在固定时间内进行计算,最终目标是计算哈希集中的列表数,以获得最终结果 我遇到的问题是,当我以这种方式创建列表时 HashSet<List<int>> finalList = new HashSet<List<int>>(); List<int> candidate = new List<in

我正在处理一个project Euler问题,我想采用创建一个值列表的方法,并将该列表添加到哈希集中,这样,如果列表已经存在于哈希集中,我可以在固定时间内进行计算,最终目标是计算哈希集中的列表数,以获得最终结果

我遇到的问题是,当我以这种方式创建列表时

HashSet<List<int>> finalList = new HashSet<List<int>>();
List<int> candidate = new List<int>();
candidate.Add(5);
finalList.Add(candidate);

if (finalList.Contains(candidate) == false) finalList.Add(candidate);
candidate.Clear();

//try next value
HashSet finalList=new HashSet();
列表候选者=新列表();
增补(5);
finalList.Add(候选者);
如果(finalList.Contains(candidate)=false)finalList.Add(candidate);
candidate.Clear();
//尝试下一个值

显然,
finalList[0]
项在我清除候选者时被清除,并且没有给我期望的结果。有可能有这样一组(整数)列表吗?如何确保每次都实例化一个新列表并将其作为一个新项添加到hashset中,比如在for循环中测试许多值和可能的列表组合?

为什么不使用每个列表唯一的值作为键或标识符?您可以为密钥创建一个哈希集,它将解锁列表。

您可以使用字典。唯一的问题是你必须测试字典是否已经有了这个列表。通过创建一个支持这种需求的简单类,这很容易做到

class TheSimpleListManager
{
    private Dictionary<String, List<Int32>> Lists = new Dictionary<String, List<Int32>>();

    public void AddList(String key, List<Int32> list)
    {
       if(!Lists.ContainsKey(key))
       {
           Lists.Add(key, list);
       }
       else
       {
          // list already exists....
       }
    }
}
为SimpleListManager分类
{
私有字典列表=新字典();
公共void AddList(字符串键,列表)
{
如果(!Lists.ContainsKey(键))
{
列表。添加(键,列表);
}
其他的
{
//列表已存在。。。。
}
}
}

这只是一个方法的快速示例。

要解决
清除问题:由于它是一个对象引用,您必须创建一个
新列表
,并将其添加到
哈希集
。 您可以通过将旧列表传递到其构造函数中来创建新列表

        HashSet<List<int>> finalList = new HashSet<List<int>>();
        List<int> candidate = new List<int>();

        candidate.Add(5);

        var newList = new List<int>(candidate);
        finalList.Add(newList);

        if (finalList.Contains(newList) == false) //Not required for HashSet
            finalList.Add(newList);

        candidate.Clear();
HashSet finalList=new HashSet();
列表候选者=新列表();
增补(5);
var newList=新列表(候选);
finalList.Add(newList);
if(finalList.Contains(newList)==false)//HashSet不需要
finalList.Add(newList);
candidate.Clear();

注意
HashSet
在添加项目之前在内部执行
包含的操作。换句话说,在这里,即使您执行
finalList.Add(newList)
n
次,它只会添加一次
newList
。因此,不必进行包含检查。

您是否希望
候选者[0]
成为关键?现在还不清楚你想在这里做什么。如果我对列表进行排序,我可以创建列表的哈希值并将创建的哈希添加到最终结果列表中吗?目标是统计我创建的唯一列表的数量。例如,(第一个候选者)list=[0]=2、[1]=6、[2]=7,并对该项目列表进行散列,例如000110,然后将该散列添加到列表或散列集中。因此,下次2,6,7出现在列表中时,它将已经包含结果哈希。我不知道我说的是否有道理:)我从一开始就理解你的问题。我的观点是,您可以为每个列表生成一个唯一的键,就像升级的排序模型中的“000110”键一样。这些密钥应该在您的HashSet中,它们应该以某种方式解锁对应于它们的列表(我可以想象许多解决方案)。因此,当您向HashSet“添加”一个新列表时,首先通过生成其唯一键来验证它。如果可以在哈希集中找到密钥,则无法添加该列表,因为它已存在于您的哈希集中。抱歉,有人说我不清楚,所以我不知道我是否解释得足够清楚。好的,我将开始朝这个方向前进,一旦我找到了生成唯一键并将其添加到哈希集中的方法。没问题,我只是想澄清我的想法。我很高兴它帮助了你,祝你好运。