C#RemoveAll,带有显示错误的通用列表

问题描述 投票:0回答:1

我正在执行SAT解算器(主要是DPLL或部分DPLL),并且具有用于单位传播的方法。基本上,它所做的是检查是否有任何独立的文字,并删除该文字以及在其他子句中找到的所有实例。任何例子都是

(x) (x,y) (w,z)

单位传播为'x',并且在执行单位传播时仅留下(w,z)

在此方法中,我有几个嵌套的foreach循环,List<literals> <literals>是定制类,具有2个变量hasNegation(布尔)和char literalCharacter

编码在下面,并将在下面说明

       foreach (clauses c1 in listOfClauses)
       {
           if (c1.listOfLiterals.Count == 1)
           {
               literals l1 = c1.listOfLiterals[0];
               solved.Add(l1);

               foreach (clauses c2 in listOfClauses)
               {
                   List<literals> tempList = new List<literals>();

                   foreach (literals l2 in listOfLiterals)
                   {
                       if (l2.solveDPLL(l1))
                       {
                           removable.Add(c2);
                       }
                       else
                       {
                           if (c2.listOfLiterals.Count == 1)
                           {
                               UNSAT = true;
                               return false;
                           }
                           else
                           {
                               if (l1.solveDPLL(l2))
                               {
                                   tempList.Add(l2);
                               }
                           }
                       }
                       c2.listOfLiterals.RemoveAll(tempList); //obviously giving error
                   }

               }
           }
       }
       return true;
   }

我有2个List <literals>,分别是templistlistOfLiterals,其中LATTER是“父母”

我试图删除与listOfLiterals匹配的tempList条目,并且我使用c2.listOfLiterals.RemoveAll(tempList);显然会输出错误,因为它不是委托。

即使在stackoverflow上,我也进行了很多搜索,但是每个搜索结果都比较一个ID或一个整数。就我而言,由于我只是比较2 Lists,因此我该如何进行委托,以便将listOfLiterals和tempList中相同的条目从listOfLiterals?

中删除

非常感谢


编辑:

文学班

    public class literals
{

    public char literalCharacter { get; set; }

    public bool negation { get; set; }
    public literals(char lc, bool neg )
    {
        literalCharacter = lc;
        negation = neg;
    }

    public bool solveDPLL (literals lit)
    {
        return ((Object.Equals(literalCharacter, lit.literalCharacter) && (negation == lit.negation)));
    }

    public String toString()
    {
        return literalCharacter + " : " + !negation;
    }

}
c# delegates removeall dpll
1个回答
1
投票

如果您可以使用LINQ魔术,则可以:

c2.listOfLiterals = c2.listOfLiterals.Except(tempList).ToList();

或循环显示tempList

foreach (var item in tempList)
{
    c2.listOfLiterals.Remove(item);
}

您可能需要您的literals类来实现IEqualityComparer<literal>,然后为EqualsGetHashCode提供一个实现。有关此示例,请参见MSDN page for Except

© www.soinside.com 2019 - 2024. All rights reserved.