从 BindingList 中删除重复项

Posted

技术标签:

【中文标题】从 BindingList 中删除重复项【英文标题】:Remove Duplicates From BindingList 【发布时间】:2013-12-17 15:12:19 【问题描述】:

BindingList 是否有任何解决方案来删除重复元素?我试过了:

 BindingList<Account> accounts = new BindingList<Account>();

 accounts.add(new Account("username", "password"));
 accounts.add(new Account("username", "password"));

 accounts = accounts.Distinct();

上述方法不起作用,因为 Distinct 返回的是 System.Collections.Generic.IEnumerable&lt;T&gt; 而不是 BindingList&lt;T&gt;

【问题讨论】:

你为什么不首先确保它们是唯一的? @DanielA.White 帐户是从文本文件加载的,用户可能会输入重复的条目。先检查有什么好处吗? 您可以将它们加载到字典/哈希集中。 它们需要在一个 BindingList 中。 BindingList 是 DataGridView 的 DataSource。 【参考方案1】:

试试这个:

foreach (var a in accounts
    .ToLookup(x => new  x.Username, x.Password )
    .SelectMany(x => x.Skip(1))
    .ToArray())

    accounts.Remove(a);

【讨论】:

【参考方案2】:

BindingList 有一个构造函数,它接受 IList&lt;T&gt;,您可以转换 Enumerable&lt;T&gt; to a List

BindingList<Account> distinctAccounts = new BindingList<Account>(accounts.Distinct().ToList());

正如King King 指出的Distinct() 使用默认的相等比较器

默认相等比较器 Default 用于比较 实现 IEquatable 泛型接口的类型。到 比较自定义数据类型,需要实现这个接口和 为该类型提供您自己的 GetHashCode 和 Equals 方法。

【讨论】:

这不会删除重复项。在 Distinct 之后对元素进行计数显示相同的元素计数,即使存在重复项。 @Torra 这是因为你的 Account 类没有覆盖 EqualsGetHashCode @KingKing 完全忘记了这样做。谢谢!

以上是关于从 BindingList 中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

从列表中删除重复项?

从给定字符串中删除重复项(不对其进行排序)[重复]

如何使用“唯一”从向量中删除重复项?

从结构中删除重复项[重复]

从 Python 列表中删除重复项

从 GeoFire 对象数组中删除重复项 [重复]