嵌套foreach循环到lambda表达式

本文关键字:lambda 表达式 循环 foreach 嵌套 | 更新日期: 2023-09-27 18:01:53

我目前正在重构一个在我就读的大学里做的项目。这种重构的部分目的是使项目的某些部分更简洁,并使用更少的代码。有时我运行几个foreach循环并向List中添加内容。

我有以下代码块,按预期工作

private List<Literal> GetClashingLiterals(ClauseNode other)
{
    List<Literal> clashes = new List<Literal>();
    foreach (Literal literal in literals)
    {
        foreach (Literal otherlit in other.literals)
        {
            if (literal.Name.Equals(otherlit.Name) 
                && !(literal.Sign.Equals(otherlit.Sign)))
            {
                clashes.Add(literal);
            }
        }
    }
    return clashes;
}

我想将这段代码转换为lambda表达式。我在stackoverflow c#上发现了这个老问题-使用lambda表达式或LINQ填充列表。

我认为这正是我所需要的,所以我制作了这个lambda表达式并对其进行了测试:

List<Literal> clashes = (List<Literal>)literals
    .Where(lit => other.literals
        .Any(lit2 => lit.Name.Equals(lit2.Name) 
            && !lit.Sign.Equals(lit2.Sign)));

然而,它不起作用。每当我尝试运行它时,我都会得到InvalidCastException。没有强制转换,它就无法编译!我错过了什么?

这是例外:

无法强制转换类型为'WhereEnumerableIterator 1[Heureka.Model.Literal]' to type 'System.Collections.Generic.List 1[Heureka.Model.Literal]'的对象。

嵌套foreach循环到lambda表达式

如错误所示,LINQ方法不返回List<T>。如果您需要List<T>,请拨打ToList()

List<Literal> clashes =  literals
    .Where(lit => other.literals
       .Any(lit2 => lit.Name.Equals(lit2.Name) && !lit.Sign.Equals(lit2.Sign)))
    .ToList();