添加所选元素的引用从ListA到ListB

时间:2016-06-23 22:14:45

标签: c# list reference

我有两个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

我该怎么做才能做到对?我适合任何帮助和灵感。感谢

3 个答案:

答案 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