Использование Отличных со списком пользовательских объектов

Как я могу сделать 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
}
9
задан nawfal 23 October 2013 в 12:13
поделиться

2 ответа

Вам необходимо переопределить 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.

16
ответ дан 4 December 2019 в 12:59
поделиться

Вы можете взять копию aku's comparer (однако остерегайтесь реализации GetHashCode), а затем написать что-то вроде этого

hrefList.Distinct(new Comparer<Href>((h1,h2)=>h1.URL==h2.URL))
0
ответ дан 4 December 2019 в 12:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: