带有显示错误的泛型列表的C#RemoveAll

本文关键字:泛型 C#RemoveAll 列表 错误 显示 | 更新日期: 2023-09-27 18:14:16

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

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

单位建议为"x",执行单位建议时,只留下(w,z)

在这个方法中,我有几个嵌套的foreach循环,List<literals> <literals>是一个自定义类,它有两个变量hasNegation(bool(和字符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;
   }

我有两个List <literals>,分别是templistlistOfLiterals,其中LATTER是"父">

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

我已经搜索了很多,甚至在stackoverflow上,但每一个都可以与ID或整数进行比较。在我的情况下,由于我只是在比较2个Lists,我如何进行委托,以便从listOfLiterals中删除listOfLittles和tempList中相同的条目

非常感谢


编辑:

文字类

    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#RemoveAll

如果你可以使用一点LINQ魔法:

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

或在tempList:上循环

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

您可能需要literals类来实现IEqualityComparer<literal>,然后提供EqualsGetHashCode的实现。请参阅Except的MSDN页面以获得一个很好的示例。