一个类知道它在数组中的位置是不好的做法吗?

时间:2013-05-16 23:47:13

标签: c# arrays class

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

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

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

3 个答案:

答案 0 :(得分:9)

  

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

这取决于,但通常是肯定的。问题在于你打破了single responsibility principle - 这个类不仅需要保持其状态,还要保持其在其他容器中的“位置”。

这可能会导致设计变得脆弱,因为没有明确的处理方案的方法,例如类在多个容器中。此外,移动项目会变得更多代码(更改集合+类内部表示)等等。

答案 1 :(得分:4)

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

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

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

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

以下是配置对象及其索引的LINQ查询示例:

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

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

答案 2 :(得分:0)

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

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

private class MyData
{
    // ...
}

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

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

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