从WPF中的列表框/组合框中删除重复项
我看到过一些答案提到这样紧凑的东西: 增编2: 当我尝试使用基于msdn链接自定义类型示例的覆盖时,它会说它是密封的:) 在单步执行GetHashCode()时,似乎没有明显的差别,但在明显的差别之后,仍然会得到相同的listbox.items.count从WPF中的列表框/组合框中删除重复项,wpf,combobox,duplicates,distinct,listbox-control,Wpf,Combobox,Duplicates,Distinct,Listbox Control,我看到过一些答案提到这样紧凑的东西: 增编2: 当我尝试使用基于msdn链接自定义类型示例的覆盖时,它会说它是密封的:) 在单步执行GetHashCode()时,似乎没有明显的差别,但在明显的差别之后,仍然会得到相同的listbox.items.count bool IEquatable<InfoControl>.Equals(InfoControl other) { if (Object.ReferenceEquals(other, null)) return false; if
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();
}
。
增编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();
}
}
public部分类InfoControl:UserControl
,i足够
{
私有字符串URL;
公共字符串URL
{
获取{return URL}
设置
{
URL=值;
}
}
bool IEquatable.Equals(youtubeinfo控制其他)
{
if(Object.ReferenceEquals(other,null))返回false;
if(Object.ReferenceEquals(this,other))返回true;
返回URL==other.URL;
}
公共覆盖int GetHashCode()
{
返回URL.GetHashCode();
}
}
如果使用listBox1.items.add添加项,则可以通过ListBox.items
或ListBox.ItemsSource
设置列表框的项,这不会影响将保持为空的ItemsSource
。在这种情况下,您应该从listBox1.Items.add获取初始列表。如果使用listBox1.Items.add添加项目,则列表框的项目可以通过ListBox.Items
或ListBox.ItemsSource
设置,这不会影响将保持为空的ItemsSource
。在这种情况下,您应该从listBox1.Items
获取初始列表。如果一次添加一个InfoControl对象,则listBox的ItemSource将保持设置为NULL。最好将列表绑定到listbox,这样以后就可以从ItemSource属性中获取数据如果一次添加一个InfoControl对象,listbox的ItemSource将保持设置为NULL。最好将列表绑定到listbox,这样以后就可以从ItemSource属性中获取数据您的意思是从listBox1获取数据。一次获取一个项目,还是有一种方法可以通过循环一次检索所有列表?谢谢像listBox1.Items.SourceCollection.Cast().ToList()
这样的东西。谢谢,我正在学习一些新东西。我还看到,为了分配给ItemsSource,我必须清除列表框,一旦我这样做(绑定)它抱怨我的。添加,所以它是绑定方式或高速公路:)我将不得不更改所有列表编辑以针对我的应用程序级列表谢谢你回答得足够多。仍然以下内容没有从UI中删除重复项可能我在设置ItemsSource后缺少刷新<代码>列表withDupes=listBox1.Items.SourceCollection.Cast().ToList();listBox1.Items.Clear();listBox1.ItemsSource=withDupes.Distinct().ToList()代码>我无法让代码标记正常工作,请参阅主要文章的附录底部。Thanky使用默认相等比较,用于引用类型,除非两者引用同一对象,否则将始终返回false。您是否多次将同一对象添加到列表中?如果没有,默认情况下不会有重复项。您可以在重载中提供自己的比较器,也可以在对象类中实现IEqualityComparer
。您的意思是从listBox1中获取它们。项目一次一个,还是有一种方法可以通过循环一次检索所有列表?谢谢像listBox1.Items.SourceCollection.Cast().ToList()
这样的东西。谢谢,我正在学习一些新东西。我还看到,为了分配给ItemsSource,我必须清除列表框,一旦我这样做(绑定)它抱怨我的。添加,所以它是绑定方式或高速公路:)我将不得不更改所有列表编辑以针对我的应用程序级列表谢谢你回答得足够多。仍然以下内容没有从UI中删除重复项可能我在设置ItemsSource后缺少刷新<代码>列表withDupes=listBox1.Items.SourceCollection.Cast().ToList();listBox1.Items.Clear();listBox1.ItemsSource=withDupes.Distinct().ToList()代码>我无法让代码标记正常工作,请参阅主要文章的附录底部。Thanky使用默认相等比较,用于引用类型,除非两者引用同一对象,否则将始终返回false。您是否多次将同一对象添加到列表中?如果没有,默认情况下不会有重复项。您可以在重载中提供自己的比较器,也可以在对象类中实现IEqualityComparer
。尽管我没有使用绑定,因为我的大脑在与MVVM:)斗争,但其他成员是否仍有语法可以一步检索列表?谢谢。实际上,关于MVVM,我还没有偶然发现一个教程,它以简单的示例模式展示了旧的(非MVVM)和MVVM方法的对比,也许最近的博客是John Papas。我还没有建立心智模型,这可能就是为什么我跳过了(绑定)步骤,先从XML构建到列表中。我想,将来所有的编辑,包括从用户界面(如DragAndDrop)中进行的源代码编辑,都应该以数据结构为目标。尽管我没有使用绑定,因为我的大脑在与MVVM:)斗争,但在其他成员身上是否还有一个语法可以一步检索列表?谢谢。实际上,关于MVVM,我还没有偶然发现一个教程,它以简单的示例模式展示了旧的(非MVVM)和MVVM方法的对比,也许最近的博客是John Papas。我还没有建立心智模型,这可能就是为什么我跳过了(绑定)步骤,先从XML构建到列表中。我认为,所有未来的编辑,包括从用户界面(如DragAndDrop)进行的源代码编辑,都应该以数据结构为目标。我刚刚测试了它,如果缺少override
关键字,它就会失败。此外,该方法还需要为euqal对象返回与rea相同的哈希代码
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(); }
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();
}
public override int GetHashCode()
{
return URL.GetHashCode();
}
public string URL
{
get { return this.URLFld.Content.ToString() ; }
set
{
this.URLFld.Content = value;
}
}
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();
}
}