私はこのようなコンパクトなものに言及している答えを見てきました:ここに
List<T> withDupes = LoadSomeData();
List<T> noDupes = withDupes.Distinct().ToList();
だから私は以下を試しました(構文)
List<InfoControl> withDupes = (List<InfoControl>)listBox1.ItemsSource;
listBox1.ItemsSource = withDupes.Distinct().ToList();
しかし、withDupesはnullですか?おそらく私は間違ったデータリストを取得しています。一度に1つずつInfoControlsを追加しました。
InfoControlクラスに実装する必要があるものは他にありますか?(等しい、hashCode)?
ありがとう補遺1:[Javaから翻訳するべきではないことを無視してください:)]また、InfoControlクラスで宣言されています(Javaの例から翻訳されています。100%正しいかどうかはわかりません)。
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();
}
}