我有两个List:List ListA和ListB(ListB的类型是我感到困惑的地方)。
此外,ListA包含{1,2,3};显然ListA [0]为1,ListA [1]为2,ListA [3]为3。
我想做的是这样的: 将ListA [0]的引用(其值为1)添加到ListB。
我期望的结果是,一旦ListA [0]更改为其他数字(例如5),从ListA添加到ListB的唯一元素应自动更改为5。我根据互联网引用的解决方案进行了多次测试,但是出现了错误/无法正常工作。
=============================================== ========================== 下面是我在跟随post()后使用的代码,它与我想要的最接近,但输出错误。
List<int> ListA;*emphasized text*
List<Ref<int>> ListB;
ListA = new List<int>();
ListA.Add(1);
ListA.Add(2);
ListA.Add(3);
ListB = new List<Ref<int>>();
Ref<int> one = new Ref<int> { Value = ListA[2] };
ListB.Add(one);
ListA[0] = 5;
foreach (int i in ListA)
{
Debug.Log("ListA: " + i);
}
foreach (Ref<int> i in ListB)
{
Debug.Log("ListB: " + i.Value);
}
public class Ref<T> where T : struct
{
public T Value { get; set; }
}
以上代码的输出是: ListA:5 ListA:2 ListA:3 ListB:1 预期结果应该是: ListA:5 ListA:2 ListA:3 ListB:5
我该怎么做才能做到对?我适合任何帮助和灵感。感谢
答案 0 :(得分:3)
您所描述的是对象而非值类型的行为。例如,如果你有一个班级:
public class SomeClass { public int TheProperty {get;set;}}
然后,您对TheProperty
的值的预期将同时在ListB和ListA中发生变化。试一试,看看你得到了什么。
当你移动一个值类型时,你正在传递实际值,而不是像处理对象时那样对该值的引用。语法相同,但托管堆栈上的实现完全不同。
答案 1 :(得分:2)
我会选择Peter4499。值类型无法实现您想要的方式。实现所需的最佳方法是使用BindingList而不是List,然后使用BindingList的CollectionModified事件来更新其他列表。每次绑定列表更改时,事件都会触发,您可以使用NotifyCollectionChangedEventargs更新其他列表。有关详细信息,请访问此MSDN article
答案 2 :(得分:1)
为此,ListA还需要包含
Ref<int>
而不是
int
您永远不能更新值类型(例如int)并期望它对您明确更新的任何其他引用有效。 以下是您的需要。
[TestClass]
public class RefOfIntTest
{
[TestMethod]
public void WhenUpdatingReferenceTypeItHasEffectForAllReferences()
{
List<Ref<int>> ListA;
List<Ref<int>> ListB;
ListA = new List<Ref<int>>();
ListA.Add(new Ref<int>(1));
ListA.Add(new Ref<int>(2));
ListA.Add(new Ref<int>(3));
ListB = new List<Ref<int>>();
Ref<int> one = ListA[0];
ListB.Add(one);
ListA[0].Value = 5;
foreach (Ref<int> i in ListA)
{
Trace.WriteLine("ListA: " + i.Value);
}
foreach (Ref<int> i in ListB)
{
Trace.WriteLine("ListB: " + i.Value);
}
}
}
public class Ref<T> where T : struct
{
public Ref(T value)
{
Value = value;
}
public T Value { get; set; }
}
请注意,我也改变了:
Ref<int> one = ListA[2];
成:
Ref<int> one = ListA[0];
因为它是后来更新的索引0