استخدام متميز مع قائمة الكائنات المخصصة
-
25-09-2019 - |
سؤال
كيف يمكنني عمل Distinct()
تعمل الطريقة مع قائمة الكائنات المخصصة (Href
في هذه الحالة) ، إليك ما يبدو عليه الكائن الحالي:
public class Href : IComparable, IComparer<Href>
{
public Uri URL { get; set; }
public UrlType URLType { get; set; }
public Href(Uri url, UrlType urltype)
{
URL = url;
URLType = urltype;
}
#region IComparable Members
public int CompareTo(object obj)
{
if (obj is Href)
{
return URL.ToString().CompareTo((obj as Href).URL.ToString());
}
else
throw new ArgumentException("Wrong data type.");
}
#endregion
#region IComparer<Href> Members
int IComparer<Href>.Compare(Href x, Href y)
{
return string.Compare(x.URL.ToString(), y.URL.ToString());
}
#endregion
}
المحلول
تحتاج إلى تجاوز Equals
و GetHashCode
.
GetHashCode
يجب إرجاع نفس القيمة لجميع الحالات التي تعتبر متساوية.
فمثلا:
public override bool Equals(object obj) {
Href other = obj as Href;
return other != null && URL.Equals(other.URL);
}
public override int GetHashCode() {
return URL.GetHashCode();
}
نظرًا لأن فئة URI الخاصة بـ .NET تتغلب على GethashCode ، يمكنك ببساطة إعادة رمز عنوان URL.
نصائح أخرى
يمكنك الحصول على نسخة من مقارنات أكو (احذر من GetHashCode
ومع ذلك التنفيذ) ، ثم اكتب شيئًا كهذا
hrefList.Distinct(new Comparer<Href>((h1,h2)=>h1.URL==h2.URL))
لا تنتمي إلى StackOverflow