2

さまざまな住所項目を持つ住所のコレクションがあります。各住所項目には、AddressType、City、Zipcode およびその他の列があります。誰かが新しい addressType を追加していて、Addresses のコレクションに既に AddressType がリストされている場合、それが既にリストされているという警告を出すという検証を書いています。どうやってやるの。私はいくつかのコードを添付しました。現在、「Job Address」をチェックするだけです。3 種類のアドレスがあります。

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

2 に答える 2

1

IEqualityComparerインターフェイスを実装する新しいAddressComparerクラスを作成する

ここで、Containsメソッドを使用します

if(Addresses.Contains(Address,new AddressComparer()))
{
      //your code
}
于 2013-08-23T17:10:27.853 に答える
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));
于 2013-08-23T17:13:50.580 に答える