仅使用 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>
.
这个问题仅用于教育目的,我可以通过使用 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>
.