如何制作包含主要项目的列表

问题描述 投票:0回答:3

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

示例:

Person class

List<PhoneNumber>
其中只有一个
PhoneNumber
bool IsPrimary
其他物品也一样 有
List<EmailAddress>
List<Address>

想象每个项目(

PhoneNumber
EmailAddress
Address
)共享相同的接口
ICanBePrimary
,其中包含一个属性
bool IsPrimary
的要求,并且当在
List<ICanBePrimary>
中时,列表中只有一个项目可以具有
IsPrimary
的真实值。

c# generic-list
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
}

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

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


0
投票

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

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

如果你这样做

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

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

PS。如果您只对“CurrentItem”行为感兴趣,您也可以使用 CollectionView 类。

© www.soinside.com 2019 - 2024. All rights reserved.