您无需创建自定义集合即可使用列表中的类。已经有一个开箱即用的泛型集合,可用于任何类(通过泛型)。
你现在可以这样做了,
[Flags()]
public enum AddressTypeValue : ushort
{
Personal = 0,
Business = 1,
POBox = 2,
Inertnational = 4
}
public class Address
{
public AddressTypeValue AddressType { get; set; }
}
public class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public Address Address { get; set; }
public Person()
{
Address = new Address() { AddressType == AddressTypeValue.Personal };
}
}
//在列表中使用它的一些代码
List<Person> people = new List<Person>();
public List<Person> GetPeopleMatchingFirstName(string firstNameToMatch)
{
var people = DBContext.People.Where(p => p.FirstName.BegintsWith(firstNameToMatch) || p.FirstName.EndsWith(firstNameToMatch) || p.FirstName.Equals(firstNameToMatch, StringComparison.InvariantCultureIgnoreCase);
return people.ToList();
}
现在,如果您想要一个强类型集合,其中您希望有自定义逻辑用于添加/删除/插入/索引等,那么只有这样您才需要实现 IList 或 IEnumerable。
虽然有任何更简单的方法可以做到这一点,因为您只需通过继承实现 List 并覆盖您想要更改的内容。如果您要更改的行为不是虚拟的(不能被覆盖),那么您可能需要 List 的自定义实现。
public class MyCustomListOfPeople : List<Person>
{
public override Add(Person person)
{
//send email that a person was added or w/e you want to do here
base.Add(person);
}
}
如果您想要一个无法添加内容的只读列表,那么您可以在传入基本列表的地方使用 ReadOnlyCollection。一旦构造完成,就不能在 ReadOnlyCollection 中添加或删除任何内容。这对于州列表、邮政编码、报告数据等非常有用。
包装一个 List 并将其公开为 IEnumerable 也很容易,而不允许访问它的添加/删除等方法。
public class AnotherListOfPeople : IEnumerable<Person>
{
private List<Person> internalList = new List<Person>();
//internal logic to manipulate people
public IEnumerator<Person> GetEnumerator()
{
return internalList.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return internalList.GetEnumerator();
}
}
执行后者允许您将私有列表的内置枚举器暴露给其他东西。因此,枚举器接口被包装类公开,这些接口允许使用 Linq 和 foreach 枚举您的类,同时阻止调用者直接访问到列表中。
您可以通过多种方式利用 List 或 IEnumerable 的强大功能,但通常您可以将 List 用于您需要的任何东西,而很少需要包装一个 List 或实现自定义集合的接口。