Удалить дубликаты из списка / выпадающего списка в WPF - PullRequest
1 голос
/ 04 мая 2011

Я видел ответы, упоминающие что-то компактное: здесь

List<T> withDupes = LoadSomeData();
List<T> noDupes = withDupes.Distinct().ToList();

Итак, я попробовал следующее (синтаксис)

List<InfoControl> withDupes = (List<InfoControl>)listBox1.ItemsSource;
listBox1.ItemsSource = withDupes.Distinct().ToList();

а withDupes равно нулю? Возможно, я получаю неправильный список данных. Я добавил инфо-элементы управления по одному.

Есть ли что-то еще, что я должен реализовывать в классе InfoControl? (Равно, хэш-код)

Спасибо Приложение 1: [игнорировать, я не должен переводить с Java :)] Также (переведен из примера Java, не уверен, что он на 100% правильный) объявлен в классе InfoControl ..

public Boolean Equals(Object obj) 
{ if (obj == this) { return true; } 
if (!(obj is InfoControl)) { return false; } 

InfoControl other = (InfoControl)obj; 
return this.URL.Equals(other.URL); } 

public int hashCode() 
{ return this.URLFld.Content.GetHashCode(); } 

Приложение 2: Когда я пытаюсь использовать переопределение на основе примера пользовательского типа ссылки msdn, он говорит, что он запечатан Кажется, что нет четкого шага через GetHashCode (), и я все еще получаю тот же listbox.items.count после отчетливого.

bool IEquatable<InfoControl>.Equals(InfoControl other)
{
if (Object.ReferenceEquals(other, null)) return false;
if (Object.ReferenceEquals(this, other)) return true;
return URL.Equals(other.URL);
}

public int GetHashCode(InfoControl obj)
{
     return obj.URL.GetHashCode();
}

Приложение 3: Когда я пытаюсь переопределить VS2010 говорит, что он запечатан? «не может переопределить унаследованный член« System.Windows.DependencyObject.GetHashCode () », потому что он запечатан« что я делаю не так?

  public override int GetHashCode()
    {
        return URL.GetHashCode();
    }

   public string URL
    {
        get { return this.URLFld.Content.ToString() ; }
        set
        {
            this.URLFld.Content = value;
        }
    }

. Приложение 4:

   public partial class InfoControl : UserControl
         , IEquatable<YouTubeInfoControl>

    {

        private string URL_;
        public string URL
        {
            get { return URL_; }
            set
            {
                URL_ = value;
            }
        }

        bool IEquatable<YouTubeInfoControl>.Equals(YouTubeInfoControl other)
        {

            if (Object.ReferenceEquals(other, null)) return false;


            if (Object.ReferenceEquals(this, other)) return true;

            return URL == other.URL;
        }

        public override int GetHashCode()
        {
            return URL.GetHashCode();
        }

    }

Ответы [ 2 ]

1 голос
/ 04 мая 2011

Элементы ListBox могут быть установлены с помощью ListBox.Items или ListBox.ItemsSource, если вы добавляете элементы с помощью listBox1.Items.Add, это не влияет на ItemsSource, который останется нулевым.В этом случае вы должны получить свой первоначальный список от listBox1.Items.

0 голосов
/ 04 мая 2011

Если вы добавляете объекты InfoControl по одному, ItemSource списка будет оставаться равным NULL.Лучше связать List со списком, что позволит вам позже вернуть данные из свойства ItemSource

...