我是徒手打出来的,所以请原谅我的打字错误。我觉得像这样做一个简单的类是最简单的方式来表示我在实际项目中想要完成的事情……反正
我怎么能使它,如果我编辑一个项目在一个集合/列表(Collection_A)..它也会反映的变化同时在一个不同的类(Collection_B)的集合/列表?
现在我要这样做的方式是只是迭代Collection_B相同的名称和品种。如果是,将其替换为Collection_A…
我觉得可能有一个更优雅的解决方案,我完全错过了一些简单的…不然的话,我就是个智障,我的解决方案可能是最好的解决方案。
我只是想"提高"我的效率和编程技术。谢谢所以public class Dog
{
public string name;
public string breed;
}
public class DogList
{
public string listName;
public static ObservableCollection<Dog> Collection_B;
}
public static ObservableCollection<Dog> Collection_A;
Collection_A.Add(new Dog("Coco", "Chihuahua"));
Collection_A.Add(new Dog("Bubba", "Bulldog"));
DogList.Collection_B.Add(Collection_A[0]);
DogList.Collection_B.Add(Collection_B[0]);
Collection_A[0] = new Dog("Coco Moco", "Chuhuahua") //how can i get this to reflect in Collection_B simultaneously?
如果两个集合中的对象都是引用类型(例如,class
而不是struct
),并且将同一个实例添加到两个集合中,则集合中有一个对相同对象实例的引用。在任何一个地方所做的更改都会自动反映到另一个地方。
但是,如果用另一个对象实例替换一个集合中的对象实例,另一个集合将不知道它:它仍然保存对原始对象的引用。为了解决这个问题,你需要使用观察者模式。
根据集合的语义和需求,可以
- 使用CLR的
ObservableCollection<T>
- 滚动您自己的实现,
- 使用C5集合库(我最喜欢的),它为所有的集合类型提供了可观察的集合。
可以在两个集合中使用相同的对象(因为它是ref类型)。所以你的代码应该是这样的:
var typeofdog = new Dog("Coco", "Chihuahua");
Collection_A.Add(typeofdog );
Collection_B.Add(typeofdog );
现在你可以改变Collection_A["YOUR ITEM"]为其他值,每个集合仍然会引用正确的答案:示例:
Collection_A["YOUR ITEM"].changeContant();//will reflect on both collections
请注意,如果您使用新词,这将不起作用,因为将初始化一个新对象。
订阅Collection_A
的CollectionChanged
事件,并为每个可能的NotifyCollectionChangedAction
适当更新Collection_B
。
ObservableCollection<int> cA = new ObservableCollection<int>();
ObservableCollection<int> cB = new ObservableCollection<int>();
cA.CollectionChanged += (sender, ev) =>
{
switch (ev.Action)
{
case NotifyCollectionChangedAction.Add:
foreach (int i in ev.NewItems)
{
Console.WriteLine("Item added");
cB.Add(i);
}
break;
case NotifyCollectionChangedAction.Replace:
var idx = ev.NewStartingIndex;
var value = (int)ev.NewItems[0];
Console.WriteLine("Item {0} replaced with {1}", idx, value);
cB[idx] = value;
break;
}
};
cA.Add(1);
cA.Add(2);
cA[1] = 3;
Console.WriteLine(cB[1]); // outputs 3
在这种情况下,您可以简单地使用以下命令:
Collection_A[0].name = "Coco Moco";
Collection_A[0].breed = "Chuhuahua";
更改将反映在两个列表中