我正在做一个SAT求解器(主要是DPLL或部分DPLL),我有单元传播的方法。基本上它的作用是它检查是否有任何独立的文字,并删除该文字,以及在其他子句中找到的任何实例。任何例子都是
(x) (x,y) (w,z)
单位传播将为'x',并且在执行单位道具时,它将仅留下(w,z)
在这个方法中,我有几个嵌套的foreach
循环,而List<literals>
<literals>
是一个自定义类,它有2个变量hasNegation
(bool)和char {{1} }
编码如下,并将从下面解释
literalCharacter
我有2 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>
和templist
,其中LATTER是“父母”
我尝试删除与listOfLiterals
匹配的listOfLiterals
条目,我使用tempList
显然会输出错误,因为它不是代表。
我搜索了很多,甚至在stackoverflow上,但是每一个都比较ID或整数。在我的例子中,因为我只是比较2 c2.listOfLiterals.RemoveAll(tempList);
,我怎么能做委托,以便listOfLiterals和tempList中相同的条目从 listOfLiterals? <中删除/ p>
非常感谢
编辑:
文学课
Lists
答案 0 :(得分:1)
如果你可以使用一点LINQ魔法:
c2.listOfLiterals = c2.listOfLiterals.Except(tempList).ToList();
或循环遍历tempList
:
foreach (var item in tempList)
{
c2.listOfLiterals.Remove(item);
}
您可能需要literals
课程来实施IEqualityComparer<literal>
,然后为Equals
和GetHashCode
提供实施方案。有关此问题的详细示例,请参阅MSDN page for Except
。