将 IEnumerables 与简单的相等运算符进行比较
Compare IEnumerables with simple equality operator
我有以下方法:
internal virtual Expression VisitMethodCall(MethodCallExpression m)
{
var obj = Visit(m.Object);
IEnumerable<Expression> args = VisitExpressionList(m.Arguments);
if (obj != m.Object
|| args != m.Arguments)
{
return Expression.Call(obj, m.Method, args);
}
return m;
}
问题是:在什么情况下 args != m.Arguments 会 return 为真?
它是否也比较引用或每个对象条件?
它只是比较引用。 args != m.Arguments
将始终 return 为真,除非它们引用同一对象。
如果 args 引用另一个对象,即使两个对象的内容相同,它仍然为真。
IEnumerable<Expression> args = m.Arguments.ToList();
bool result = args != m.Arguments; // true
如果你想比较两个可枚举的内容,包括它们的顺序,你可以使用:
Enumerable.SequenceEqual(args, m.Arguments);
更多信息:
我有以下方法:
internal virtual Expression VisitMethodCall(MethodCallExpression m)
{
var obj = Visit(m.Object);
IEnumerable<Expression> args = VisitExpressionList(m.Arguments);
if (obj != m.Object
|| args != m.Arguments)
{
return Expression.Call(obj, m.Method, args);
}
return m;
}
问题是:在什么情况下 args != m.Arguments 会 return 为真? 它是否也比较引用或每个对象条件?
它只是比较引用。 args != m.Arguments
将始终 return 为真,除非它们引用同一对象。
如果 args 引用另一个对象,即使两个对象的内容相同,它仍然为真。
IEnumerable<Expression> args = m.Arguments.ToList();
bool result = args != m.Arguments; // true
如果你想比较两个可枚举的内容,包括它们的顺序,你可以使用:
Enumerable.SequenceEqual(args, m.Arguments);
更多信息: