List <t>()。添加问题C#</t>

时间:2010-10-07 10:40:06

标签: c# list

我制作了一个List来保存对象,然后我会读它。但即使我给List一个索引,我总是得到相同的对象结果。这是代码:

            List<TempIds> treeDIds = new List<TempIds>();
            TempIds tempIds = new TempIds();


            foreach (ItemGroupTreeD treeD in itemTreeDColl)
            {

                //Idleri listeye alıyoruz daha sonra karşılaştırma yapmak için
                tempIds.TreeDId = treeD.Id;
                tempIds.TreeParentId = treeD.TreeParentId;
                treeDIds.Insert(treeDIds.Count, tempIds);
                //----

                //Eğer ilk gelen detay id ile methoda gelen id bir ise collectiona ekliyoruz.
                if (tempIds.TreeDId == groupTreeDId)
                {
                    treeDTempColl.Add(treeD);
                }
                else
                {
                    //Burada karşılaştırma yapıyoruz.
                    for (int i = 0; i < treeDIds.Count; i++)
                    {
                        if (tempIds.TreeParentId == treeDIds[i].TreeDId)
                        {
                            treeDTempColl.Add(treeD);
                            break;
                        }
                    }
                }

            }

例如:

对于第一个循环TreeDId = 3和TreeParentId = 1然后我插入索引0.第二个循环TreeDId = 2,TreeParentId = 1,然后插入索引1.当循环进入List时,我总是得到TreeDId = 2并且TreeParentId = 1,因为最后一个循环是第二个循环。我还能做什么?

谢谢。

5 个答案:

答案 0 :(得分:11)

只有一个tempIds对象。列表中的项目是相同的项目,并且其中包含最后一项。 将TempIds tempIds = new TempIds();移动到循环中

        foreach (ItemGroupTreeD treeD in itemTreeDColl)
        {
          TempIds tempIds = new TempIds();

请记住,列表不包含您添加的数据的副本。它包含对您添加的对象的引用。这样做会创建一个新对象,供您每次插入。

答案 1 :(得分:0)

我认为,您正在循环中修改同一个对象。由于列表只是持有对同一对象的引用,因此您将在所有索引中看到相同的对象。

您需要在foreach块中移动var tempIds =new TempIds();

并可选择使用treeDIds.Add(tempIds);代替treeDIds.Insert(treeDIds.Count, tempIds);

答案 2 :(得分:0)

您可能不止一次使用相同的object reference。您的类TempIdsItemGroupTreeD,如果可能,应该成为一个结构,只需添加对象,或者让它们从IClonable继承,然后添加对象的克隆。

答案 3 :(得分:0)

我认为您需要在foreach循环中重新tempIds

答案 4 :(得分:0)

您正在重新插入相同的参考。 Clone()或者在循环中移动它的创建。