1

类将其位置存储在数组中是不好的做法吗?

同样,集合维护每个对象的内部位置是不好的做法吗?

如果这些都是不好的做法,那么快速访问数组中对象的位置或保持该位置的更好方法是什么?

4

3 回答 3

9

类将其位置存储在数组中是不好的做法吗?

这取决于,但通常是的。问题是你打破了单一责任原则——类不仅要维护它的状态,还要维护它在其他容器中的“位置”。

这可能导致脆弱的设计,因为没有一种明确的方法来处理诸如类位于多个容器中的场景。此外,移动项目变得维护更多代码(更改集合 + 类内部表示)等。

于 2013-05-16T23:49:12.767 回答
4

一般来说,是的,这是一种不好的做法,原因有两个:

  • 不应该存储可以计算的东西(例如存储年龄和 DOB 是一种不好的做法),并且
  • 一个对象可以同时属于多个集合,因此可能不清楚它应该跟踪哪个集合。

有两种方法可以解决这个问题:

  • 首先要避免它——而不是传递对象,而是传递它们在集合中的索引。当您需要访问对象时,将索引应用于集合。这样,索引仍然是您对对象的“主要参考”,因此找到它永远不会成为问题,或者
  • 根据需要计算位置- 保留对象不保留索引的正常集合。当您需要配对对象和索引时,运行一个 LINQ 查询将它们临时配对;不再需要时立即丢弃结果。

下面是一个用于配对对象及其索引的 LINQ 查询示例:

var objIndexPair = collection.
    Select((v, i) => new {
        Index = i
    ,   Object = v
    }).ToList();

请注意,这种方法不会让类知道它在集合中的位置。相反,匿名类将对象与其在集合中的位置配对,解决了对象属于多个集合的问题。

于 2013-05-16T23:56:37.507 回答
0

如果您的类中的一个对象存储在另一个类中 - 在这种情况下是一个数组 - 那么该类有责任告诉您该对象在其自身中的存储位置。如果保证您的对象仅与一个其他类一起存储,那么您可能在包含的类中对包含类有一个引用,但仅此而已。

如果您使用集合,那么这正是您可以做的:

private class MyData
{
    // ...
}

private List<MyData> myDataList = new List<MyData>();

public void SomeMethod()
{
    MyData myData = ...;
    int position = myDataList.IndexOf(myData);
}

除非绝对必须,否则您真的不应该使用数组。如果可以的话,将从一些古老的遗留 API 获得的数组转换为集合(即列表),并在完成它们后将它们转换回数组。

于 2013-05-17T00:01:11.777 回答