C#编辑具有相同引用的两个列表的项目

时间:2013-06-11 11:25:56

标签: c# list reference pass-by-reference

我有一个myClass个对象列表(之前添加了一些元素)

List<myClass> myClassList1;

然后我将此列表中的一些元素复制到另一个列表中

List<myClass> myClassList2 = new List<myClass>();
foreach (myClass obj in myClassList1)
{
  myClassList2.Add(obj);
}

此列表现已排序

myClassList2.sort();

然后我想修改此排序列表中的第一个元素

myClassList2[0].id++;

问题:在myClassList2中,此元素已修改,但未在myClassList1中修改。

我认为将myClass个对象添加到列表中会添加对该对象的引用,因此我可以在列表中修改它(这是实际的计划)。

1 个答案:

答案 0 :(得分:0)

它会像您期望的那样更新myClassList1。您可能想发布您的代码。这是我更新两个列表的代码。

    public class myClass
    {
        int _id;
        public myClass(int id)
        {
            Id = id;
        }
        public int Id
        {
            get
            {
                return _id;
            }
            set
            {
                _id = value;
            }
        }
    }

    public void BuildList()
    {
        List<myClass> myClassList1 = new List<myClass>();
        myClassList1.Add(new myClass(8));
        myClassList1.Add(new myClass(4));
        myClassList1.Add(new myClass(10));
        myClassList1.Add(new myClass(1));   // This would become the first item when the list is sorted.
        myClassList1.Add(new myClass(30));

        List<myClass> myClassList2 = new List<myClass>();
        foreach (myClass obj in myClassList1)
        {
            myClassList2.Add(obj);
        }

        myClassList2.Sort((s1, s2) => s1.Id.CompareTo(s2.Id));  // Sort by Id.

        // Modify the first element in the second sorted list.
        myClass firstElementList2 = myClassList2[0];
        firstElementList2.Id++;
        int valueInList2 = firstElementList2.Id; // Get the id that is incremented

        // Find the same object in first list...
        myClass sameElementInList1 = myClassList1.Find(x => x.Id.Equals(valueInList2));
        int valueInList1 = sameElementInList1.Id;

        if (valueInList2== valueInList1)
        {
            MessageBox.Show("Cheers!");
        }
    }

测试:

[TestMethod]
        public void SKTestMethod()
        {
            Class1 c1 = new Class1();
            c1.BuildList();
        }