类将其位置存储在数组中是不好的做法吗?
同样,集合维护每个对象的内部位置是不好的做法吗?
如果这些都是不好的做法,那么快速访问数组中对象的位置或保持该位置的更好方法是什么?
类将其位置存储在数组中是不好的做法吗?
这取决于,但通常是的。问题是你打破了单一责任原则——类不仅要维护它的状态,还要维护它在其他容器中的“位置”。
这可能导致脆弱的设计,因为没有一种明确的方法来处理诸如类位于多个容器中的场景。此外,移动项目变得维护更多代码(更改集合 + 类内部表示)等。
一般来说,是的,这是一种不好的做法,原因有两个:
有两种方法可以解决这个问题:
下面是一个用于配对对象及其索引的 LINQ 查询示例:
var objIndexPair = collection.
Select((v, i) => new {
Index = i
, Object = v
}).ToList();
请注意,这种方法不会让类知道它在集合中的位置。相反,匿名类将对象与其在集合中的位置配对,解决了对象属于多个集合的问题。
如果您的类中的一个对象存储在另一个类中 - 在这种情况下是一个数组 - 那么该类有责任告诉您该对象在其自身中的存储位置。如果保证您的对象仅与一个其他类一起存储,那么您可能在包含的类中对包含类有一个引用,但仅此而已。
如果您使用集合,那么这正是您可以做的:
private class MyData
{
// ...
}
private List<MyData> myDataList = new List<MyData>();
public void SomeMethod()
{
MyData myData = ...;
int position = myDataList.IndexOf(myData);
}
除非绝对必须,否则您真的不应该使用数组。如果可以的话,将从一些古老的遗留 API 获得的数组转换为集合(即列表),并在完成它们后将它们转换回数组。