如何解决在lambda上执行distinct时,替代IEquatable接口
public class ArticleDescriptionDetails : IEquatable<ArticleDescriptionDetails>
{
public string Code { get; set; }
public string Value { get; set; }
public bool Hidden { get; set; }
public bool Equals(ArticleDescriptionDetails other)
{
if (ReferenceEquals(null,other)) return false;
if (ReferenceEquals(this,other)) return true;
return Code == other.Code;
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null,obj)) return false;
if (ReferenceEquals(this,obj)) return true;
return obj.GetType() == GetType() && Equals((ArticleDescriptionDetails) obj);
}
public override int GetHashCode() => ((Code != null ? Code.GetHashCode() : 0) * 397) ^ Hidden.GetHashCode();
public static bool operator ==(ArticleDescriptionDetails left,ArticleDescriptionDetails right) => Equals(left,right);
public static bool operator !=(ArticleDescriptionDetails left,ArticleDescriptionDetails right) => !Equals(left,right);
}
我需要这样做是因为我正试图以这种方式返回IEquatable<ArticleDescriptionDetails>
:
return result.OrderBy(x => x.Code).ThenBy(y => y.Hidden).distinct();
是否有一种无需使用IEquatable<T>
界面即可完成相同操作的方法?
解决方法
您可以使用DistinctBy方法并执行
return result.OrderBy(x => x.Code).ThenBy(y => y.Hidden).DistinctBy(z => z.Code);
但是linq中不存在DistinctBy方法,但是您可以在morelinq软件包https://www.nuget.org/packages/MoreLinq.Source.MoreEnumerable.DistinctBy/
中找到它但是编写自己的方法版本也很容易: 您首先需要定义IEqualityComparer
public class KeyEqualityComparer<T,K> : IEqualityComparer<T>
{
private readonly Func<T,K> selector;
public KeyEqualityComparer(Func<T,K> keySelector)
{
selector = keySelector;
}
public bool Equals(T x,T y)
{
return selector(x).Equals(selector(y));
}
public int GetHashCode(T obj)
{
return selector(obj).GetHashCode();
}
}
您可以在Distinct方法中使用此IEqualityComparer:
public static IEnumerable<T> DistinctBy<T,K>(this IEnumerable<T> list,Func<T,K> keySelector)
{
var equalityComparer = new KeyEqualityComparer<T,K>(keySelector);
return list.Distinct(equalityComparer);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。