类是否将其位置存储在数组中是不好的做法?
同样,集合维护每个对象的内部位置是不好的做法吗?
如果这些是不好的做法,有什么更好的方法可以快速访问数组中对象的位置或维持该位置?
答案 0 :(得分:9)
类是否将其位置存储在数组中是不好的做法?
这取决于,但通常是肯定的。问题在于你打破了single responsibility principle - 这个类不仅需要保持其状态,还要保持其在其他容器中的“位置”。
这可能会导致设计变得脆弱,因为没有明确的处理方案的方法,例如类在多个容器中。此外,移动项目会变得更多代码(更改集合+类内部表示)等等。
答案 1 :(得分:4)
一般来说,是的,这是一种不好的做法,原因有两个:
有两种方法可以解决这个问题:
以下是配置对象及其索引的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获得的数组转换为集合(即列表),并在完成后将它们转换回数组。