【发布时间】:2011-10-12 07:05:35
【问题描述】:
我有一个对象 A 的集合。每个 A 都有一个与对象 B 相关的字段 - 我有另一个集合。换句话说,每个 B 都附加到 As 集合的一个子集(但只是在概念上,而不是在代码中)。该字段(将 A 与 B 相关联)可以在系统的生命周期内发生变化。有一些系统要求阻止了这种结构的改变。
如果我需要对每个 B 的 A 集合重复执行操作,最好对 A 的集合重复使用 Where() 方法还是创建 B 拥有的另一个集合和一个管理添加和删除的类的相关项目。
让我看看我是否可以在代码中捕获它:
class A {
public B owner;
...
}
class B {
...
}
class FrequentlyCalledAction {
public DoYourThing(B current) {
List<A> relevantItems = listOfAllAItems.Where(x => x.owner == current).ToList()
foreach (A item in relevantItems) {
...
}
}
}
对比:
class A {
public B owner;
...
}
class B {
public List<A> itsItems;
}
class FrequentlyCalledAction {
public void DoYourThing(B current) {
foreach (A item in current.itsItems) {
...
}
}
}
class AManager {
public void moveItem(A item, B from, B to) {
from.itsItems.remove(item);
to.itsItems.add(item);
}
}
【问题讨论】:
-
你多久做一次? A->B 关系多久改变一次? As 和 B 的集合有多大? B 不能引用 A 吗?
-
DoYourThing 是系统中最频繁的调用之一。 A->B 关系可能每 4 次 DoYourThing 调用改变一次。它们都是小型套装 - 可能是 50 B,也可能是 100 A。
-
A 需要多久知道一次它的所有者是谁?您能否将 A 存储在其所有者身上,并在需要时确定其所有者是谁?
-
系统的其他部分需要 A 知道它的所有者。
-
你最后决定做什么?
标签: c# performance coding-style