我看到答案提到像这样紧凑的东西:here
List<T> withDupes = LoadSomeData();
List<T> noDupes = withDupes.Distinct().ToList();
所以我尝试了以下(语法)
List<InfoControl> withDupes = (List<InfoControl>)listBox1.ItemsSource;
listBox1.ItemsSource = withDupes.Distinct().ToList();
但withDupes为null?也许我正在检索错误的数据列表。我一次添加一个InfoControls。
我应该在InfoControl类中实现其他什么吗? (等,的hashCode)?
由于 附录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();
}
}
答案 0 :(得分:1)
如果您使用ListBox.Items
添加项目,则可以通过ListBox.ItemsSource
或listBox1.Items.Add
设置列表框的项目,这不会影响保留为空的ItemsSource
。在这种情况下,您应该从listBox1.Items
获取初始列表。
答案 1 :(得分:0)
如果您一次添加一个InfoControl对象,则listBox的ItemSource将保持设置为NULL。您最好将List绑定到列表框,以便稍后从ItemSource属性中取回数据