如何删除ObservableCollection<Customer>
中的重复项
班级Customer
有string Name
,s tring PhoneNumber
如果我在第一时间添加Name = Jonh
- 确定
在第二个Name = Jonh
(重复)&lt; --------------------
我希望删除重复的项目。
(删除重复的名称,不删除PhoneNumber)
答案 0 :(得分:7)
您可以实现此目的的一种方法是在将名称添加到集合之前确保该名称尚未包含在集合中。在WP7中,这可以通过简单的LINQ语句实现。你可以做这样的事情,假设你的集合被称为“cusomterList”
public bool AddCustomer(Customer customer) {
if(null != customer) {
if(customerList.Count(c => c.Name == customer.Name) == 0) {
customer.Add(customer);
return true;
}
}
return false;
}
答案 1 :(得分:5)
每次使用LINQ查找重复项时,共有O(N)。插入所有项目最糟糕的是O(N ^ 2)。
您可以使用Dictionary(基于哈希表)(平均插入时间为O(N))。
我创建了从ObservableCollection
继承的集合,它提供了独特的元素:
public class Customer
{
public string Name { get; set;}
public override int GetHashCode()
{
return Name.GetHashCode();
}
public override bool Equals(object obj)
{
if(obj == null || !(obj is Customer))
return false;
return (obj as Customer).Name.Equals(Name);
}
}
public class UniqueObservableCollection<T> : ObservableCollection<T>
{
private Dictionary<T, bool> _itemsDict = new Dictionary<T, bool>();
protected override void InsertItem(int index, T item)
{
if(_itemsDict.ContainsKey(item))
return;
_itemsDict.Add(item, true);
base.InsertItem(index, item);
}
protected override void ClearItems()
{
_itemsDict.Clear();
base.ClearItems();
}
protected override void RemoveItem(int index)
{
if(index >= base.Items.Count)
return;
var item = base.Items[index];
if(!_itemsDict.ContainsKey(item))
return;
_itemsDict.Remove(item);
base.RemoveItem(index);
}
}
您需要覆盖Customer类中的GetHashCode和Equals方法。
答案 2 :(得分:2)
首先,如果您希望在名称上比较Customer
课程,那么您应该在课堂上实施IEquatable<Customer>
,如下所示:
public bool Equals(Customer other)
{
if (other == null)
return false;
return this.Name == other.Name;
}
其次,将项目插入ObservableCollection<Customer>
后,您需要进行检查,如下所示:
if (customers.Contains(newCustomer) == false)
customers.Add(newCustomer)
或者像Ivan建议的那样实现ObservableCollection<T>
的自定义实现。您在同一办理登机手续的地方。
答案 3 :(得分:0)
您可以使用此代码阻止添加重复条目
if(collection.Any(p => p.Name == newPerson.Name) == false)
{
collection.Add(newPerson);
}
else
{
//Show Message "Already Exist!"
}
这个工作正常。希望对你有用。