【问题标题】:Nested foreach loop to lambda-expressions将 foreach 循环嵌套到 lambda 表达式
【发布时间】:2014-05-06 16:52:36
【问题描述】:

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

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

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# - Populate a list using lambda expressions or 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。没有演员表,它不会编译!那我错过了什么?

这是个例外:

无法转换类型为“WhereEnumerableIterator1[Heureka.Model.Literal]' to type 'System.Collections.Generic.List1[Heureka.Model.Literal]”的对象。

【问题讨论】:

    标签: c# exception foreach lambda


    【解决方案1】:

    正如错误所说,LINQ 方法不返回 List&lt;T&gt;。如果您需要List&lt;T&gt;,您需要致电ToList()

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      相关资源
      最近更新 更多