我目前正在重构我在大学就读的一个项目。这种重构的一部分是使项目的一部分更简洁,并使用更少的代码。有时我会运行几个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# - Populate a list using lambda expressions or LINQ上找到了这个老问题。
我认为这正是我所需要的,所以我做了这个lambda-expresison并测试了它:
List<Literal> clashes = (List<Literal>)literals
.Where(lit => other.literals
.Any(lit2 => lit.Name.Equals(lit2.Name)
&& !lit.Sign.Equals(lit2.Sign)));
然而它并不起作用。每当我尝试运行它时,我都会收到InvalidCastException。没有演员表,它不会编译!那我错过了什么?
这是一个例外:
无法转换类型为&#39; WhereEnumerableIterator
1[Heureka.Model.Literal]' to type 'System.Collections.Generic.List
1 [Heureka.Model.Literal]&#39;。
答案 0 :(得分:8)
如错误所示,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();