【问题标题】:Best practices for making a 2D array/collection class制作二维数组/集合类的最佳实践
【发布时间】:2013-06-03 13:37:45
【问题描述】:

我正在开发一个将在其他应用程序中广泛使用的通用库。可以说是一种SDK库。

我需要实现一个 2D 集合实现。它将是一个通用模板抽象类。那么制作二维数组或集合的好做法是什么。它就像一个网格结构。

这是我为一维集合所做的。

public abstract class BaseCollection<T> : Collection<T>

我应该为 2D 收藏做什么。 [,] 或其他。

【问题讨论】:

  • 如果它是一个 2D 集合,那么我认为你不应该从 1D 基类派生(因为你会得到像 Add 这样的无意义的方法)。实现您自己的集合,然后添加有意义的接口实现(例如 IEnumerable 如果顺序扫描有意义)。这并不意味着您不能在后台使用它们,但您的用户应该会看到(如果他们调用 RemoveAt(123),您将删除哪个元素?)

标签: c# arrays collections 2d


【解决方案1】:

有许多选项,但部分取决于您的 2D 集合的实际实现是什么。

如果你只想要一个二维数组,那么有一个特殊的语法。这是一个二维字符串数组:

string[,] twoDimStringArray = new string[4,5];

另一种选择是有一个列表列表:

List<List<string>> listOfListOfString = new List<List<string>>();

你可以有一个锯齿状的数组:

string[][] arrayOfArraysOfString = new string[5][];

一般来说,我不鼓励您拥有一个扩展另一种集合类型的类。通常最好封装另一种类型的集合。如果您的类本身作为集合公开,则使用适当的各种接口,例如IEnumerableICollectionIListISet 等。

如果你有一个二维索引列表样式的集合,那么你可以让你的类是 IList&lt;IList&lt;T&gt;&gt; 或 `ICollection>,如果你想公开这些接口的功能级别(你可能不会,在不了解更多上下文的情况下很难判断)。

【讨论】:

  • 我正在考虑实现 [,]。这符合我的条件。
  • 在一维实现中,我有一些被广泛使用的功能,比如上移、下移、删除、可以上移,而且由于我也在编写单元测试,所以代码是重复的,所以我决定编写一个基集合类及其单元测试,以便派生类不需要一次又一次地编写相同的单元测试,
  • @FaisalHafeez 这样的类的实现不应该是重复的。如果它们是,则意味着您实际上并没有不同类型的集合,您应该只拥有一个并利用组合来代替。将具有集合的类作为字段,而不是从集合类型继承。如果集合真的不同,那么这些方法的实现,甚至它们能够公开的公共 API 也应该不同。查看DictionaryListLinkedListHashSet 等类。它们没有任何公共基础集合。
猜你喜欢
  • 2011-03-31
  • 2010-09-18
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2021-10-18
相关资源
最近更新 更多