如何检查ObservableCollection中的重复项?

时间:2013-08-23 17:04:49

标签: c# linq collections

我有一个地址集合,它有不同的地址项。每个地址项都有AddressType,City,Zipcode和其他列。我正在编写一个验证,如果有人正在添加一个新的addressType并且Addressses集合已经列出了AddressType,那么请发出已经列出的警告。我怎样才能做到这一点。我附上了一些代码。现在它只检查它的“工作地址”。我有三种类型的地址。

       if (Addresses.Any
            (a => a.AddressType =="Job Address"))
        {
            DialogManager.ShowMessageBox(("The type has already been listed "),       
         MessageBoxButton.OKCancel);
        }

2 个答案:

答案 0 :(得分:1)

创建一个新的AddressComparer类,实现IEqualityComparer接口

现在使用Contains方法

if(Addresses.Contains(Address,new AddressComparer()))
{
      //your code
}

答案 1 :(得分:1)

如果您在事后检查此内容,则可以使用HashSet<string>

的大小
var types = new HashSet<string>(Addresses.Select(aa => aa.AddressType));
if (types.Count < Addresses.Count)
{
    // You have a duplicate...
    // ...not necessarily easy to know WHO is the duplicate
}

以上工作方法是将每个AddressType实例分配给一个集合。集合是仅包含添加的唯一项目的集合。因此,如果输入序列中有重复项,则该组将包含的项目少于输入序列。您可以这样说明这种行为:

// And an ISet<T> of existing items
var types = new HashSet<string>();

foreach (string typeToAdd in Addresses.Select(aa => aa.AddressType))
{
    // you can test if typeToAdd is really a new item
    // through the return value of ISet<T>.Add:
    if (!types.Add(typeToAdd))
    {
        // ISet<T>.Add returned false, typeToAdd already exists
    }
}

如果你以类似的方式实现它,可能事先通过命令的CanExecute预先更好的方法:

this.AddCommand = new DelegateCommand<Address>(
    aa => this.Addresses.Add(aa),
    aa => !this.Addresses.Any(xx => xx.AddressType == aa.AddressType));