仅使用 LINQ 时使用 IEquatable 比较两个集合

Comparing two collections with IEquatable while using only LINQ

这个问题仅用于教育目的,我可以通过使用 for 循环轻松解决它 returns false 在第一次不匹配时。

我正在 CustomerFeedbackViewModel 上实现 IEquatable<CustomerFeedbackViewModel>,它有一个 QuestionViewModel 的集合,我需要逐个元素进行比较。

public class CustomerFeedbackViewModel 
{
    public List<QuestionViewModel> Questions { get; set; }

    public string PageName { get; set; }

    public string SessionId { get; set; }
}

在实现 Equals 而不是使用上面提到的 for 循环时,我想使用 TrueForAll 方法,它看起来如下所示。

public bool Equals(CustomerFeedbackViewModel other)
    {
        if (ReferenceEquals(null, other)) return false;
        if (ReferenceEquals(this, other)) return true;
        return Questions.TrueForAll((o,i) => o.Equals(other.Questions.ElementAt(i))) && string.Equals(PageName, other.PageName) && string.Equals(SessionId, other.SessionId);
    }

OfcTrueForAll没有指数以上永远飞不起来

如何在不使用 for 循环而是使用 linq 'oneliner' 的情况下实现两个列表的比较?

您应该使用 Enumerable.SequenceEqual:

,而不是在所有索引处比较每个问题
return string.Equals(PageName, other.PageName) 
    && string.Equals(SessionId, other.SessionId) 
    && Questions.SequenceEqual(other.Questions);

如果您不覆盖 QuestionViewModel 中的 Equals + GethashCode,您可以提供自定义 IEqualityComparer<QuestionViewModel> 并将其传递给 SequenceEqual 重载或实施 IEquatable<QuestionViewModel>.