I'm writing a class to represent a Pivot Collection, the root object recognized by Pivot. A Collection has several attributes, a list of facet categories (each represented by a FacetCategory
object) and a list of items (each represented by a PivotItem
object). Therefore, an extremely simplified Collection reads:
public class PivotCollection
{
private List<FacetCategory> categories;
private List<PivotItem> items;
// other attributes
}
What I'm unsure of is how to properly grant access to those two lists. Because declaration order of both facet categories and items is visible to the user, I can't use sets, but the class also shouldn't allow duplicate categories or items. Furthermore, I'd like to make the Collection object as easy to use as possible. So my choices are:
Have
PivotCollection
implementIList<PivotItem>
and have accessor methods forFacetCategory
: In this case, one would add an item to Collectionfoo
by writingfoo.Add(bar)
. This works, but since a Collection is equally both kinds of list making it only pass as a list for one type (category or item) seems like a subpar solution.Create nested wrapper classes for
List
(CategoryList
andItemList
). This has the advantage of making a consistent interface but the downside is that these properties would no longer be able to serve as lists (because I need to override the non-virtualAdd
method I have to implementIList
rather than subclassList
. Implicit casting wouldn't work because that would return theAdd
method to its normal behavior.
Also, for reasons I can't figure out, IList
is missing an AddRange
method...
public class PivotCollection
{
private class CategoryList: IList<FacetCategory>
{
// ...
}
private readonly CategoryList categories = new CategoryList();
private readonly ItemList items = new ItemList();
public CategoryList FacetCategories
{
get { return categories; }
set { categories.Clear(); categories.AddRange(value); }
}
public ItemList Items
{
get { return items; }
set { items.Clear(); items.AddRange(value); }
}
}
Finally, the third option is to combine options one and two, so that PivotCollection
implements IList<PivotItem>
and has a property FacetCategories
.
Question: Which of these three is most appropriate, and why?