1

共有可能な動作のアイテムのリストが必要です。

例:

Person class

他のアイテムと同じものがList<PhoneNumber> 1つだけある場所があり ますPhoneNumberbool IsPrimaryList<EmailAddress>List<Address>

各アイテム(、、PhoneNumber)がEmailAddress、1つのプロパティの要件を含むAddress同じインターフェイスを共有し、リスト内の1つのアイテムのみが。の真の値を持つことができると想像してください。ICanBePrimarybool IsPrimaryList<ICanBePrimary>IsPrimary

4

3 に答える 3

3

最もクリーンなアプローチは、コンテンツを列挙できるクラスの背後にリストを隠し、プライマリ アイテムを識別するための追加のメソッドを提供することです。

class AddressList : List<Address> {
    private int indexOfPrimaryAddress = 0;
    public Address PrimaryAddress {
        get {
            return this[indexOfPrimaryAddress];
        }
        set {
            indexOfPrimaryAddress = this.IndexOf(value);
        }
    }
    // Override more methods to make sure that the index does not become "hanging"
}

さらにクリーンな実装では、リストをクラス内にカプセル化し、AddressList公開したいメソッドのみを公開します。

class AddressList : IList<Address> {
    private int indexOfPrimaryAddress = 0;
    private readonly IList<Address> actualList = new List<Address>();
    // Implement the List<Address> by forwarding calls to actualList
}
于 2012-10-17T18:53:22.793 に答える
2

プライマリ itemの概念を持つ独自の特殊なコレクション クラスを作成できます。

このようなもの:

public class ListWithPrimary<T> : List<T> {
    public bool HasPrimary { get; private set; }
    private T primary;
    public T Primary
    {
        get
        {
            return primary;
        }
        set
        {
            if (!Contains(value)) throw new Exception();
            primary = value;
        }
    }
    public void AddPrimary(T item)
    { 
        Add(item);
        primary = item;
        HasPrimary = true;
    }
    public void ClearPrimary() {
        primary = default(T);
        HasPrimary = false;
    }
    .... 
}

(上記はまだ不完全であることに注意してください。プライマリ アイテムが常にリストの一部であるという不変条件を維持する必要があります。)

于 2012-10-17T18:53:18.103 に答える
0

削除されたものを再投稿しています...ご覧のとおり...質問は十分に明確ではなく、説明が必要でした...しかし、それでも...すべての回答が「はい」であると仮定して質問に答えました。それでも、質問の著者は私の投稿に削除のマークを付けました...そしてモデレーターは、別の仲間が著者に同意しなかったにもかかわらず、それを行いました.

もっと情報が必要です。

Person、EmailAddress、および Address クラスで INotifyPropertyChanged を使用していますか、または使用できますか?

IsPrimary プロパティをクラスの一部にする必要がありますか?

もしあなたがそうするなら

次に、アイテムのすべての PropertyChanged イベント (そのインターフェイスの一部) をリッスンし、IsPrimary への変更をインターセプトしてから、それが ON に切り替わるかどうかを確認してから、他のすべてのアイテムの IsPrimary を OFF に切り替えます。

それがあなたが求めた行動を達成するための適切な方法であることを覚えておいてください. そうはい、それは適切な答えです。

PS。「CurrentItem」の動作のみに関心がある場合は、CollectionView クラスを使用することもできます。

于 2012-10-17T19:25:20.740 に答える