1

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

例子:

Person class

有 其他物品List<PhoneNumber> 只有一个相同PhoneNumber有 有bool IsPrimaryList<EmailAddress>List<Address>

想象一下,每个项目 ( PhoneNumber, EmailAddress, Address) 共享相同的接口ICanBePrimary,其中包含一个属性的要求,bool IsPrimary并且当List<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

您可以创建自己的具有主要项目概念的专用集合类。

像这样的东西:

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 回答