如何创建具有主要项目的列表

时间:2012-10-17 18:49:11

标签: c# generic-list

我需要一个具有可共享行为的项目列表。

示例:

Person class

List<PhoneNumber> 只有一个PhoneNumberbool IsPrimary 其他项目相同 有List<EmailAddress>List<Address>

想象一下,每个项目(PhoneNumberEmailAddressAddress)共享相同的接口ICanBePrimary,其中包含一个属性bool IsPrimary的要求以及List<ICanBePrimary>列表中只有一个项目可以具有IsPrimary的真值。

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分:2)

您可以创建自己的专门收藏类,其中包含主要项目的概念。

这样的事情:

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;
    }
    .... 
}

(请注意,上述内容仍然不完整。您必须保持主要项始终是列表的一部分的不变量。)

答案 2 :(得分:0)

重新发布已删除的内容...... 我们都看到......问题不够清楚,需要澄清...... 但仍然......我回答了这个问题,假设所有答案都是&#34;是&#34;。 仍然是该问题的作者标记了我的删除帖子......和版主尽管另一个人不同意作者,但是它确实没有。

我们需要更多信息。

您是否在Person,EmailAddress和Address类中使用或可以使用INotifyPropertyChanged?

您真的要求IsPrimary属性成为您的类的一部分吗?

如果您这样做

然后您可以在项目上侦听所有PropertyChanged事件(属于该界面的一部分)并拦截对IsPrimary的更改,然后您将检查它是否切换为ON然后在所有其他项目上切换IsPrimary关闭。

请记住,这是实现您所要求的行为的正确方法。是的,这是正确的答案。

PS。如果您只对&#34; CurrentItem&#34;感兴趣,您也可以使用CollectionView类。行为。