两个克隆变量在列表上返回相同的索引

时间:2013-02-13 13:01:11

标签: c# list clone

我有一个列表,其中包含许多来自X类的对象。

我通过clone函数添加一个对象,它获取自己的索引,但是如果我使用克隆再添加一个对象,则该对象将获得与第一个克隆相同的索引。

这里有一些代码:

public void AddCopyObj(List<x> MyList, int Idx)
{
  x AddCloneObj=MyList[Idx].Clone();
  MyList.Insert(Idx+1,AddCloneObj)
}

public List<int> GetAllIndexs(List<x> MyList)
{
  List<int> IndexList = new List<int>();
  foreach(x myXvar in MyList)
  {
    IndexList.add(MyList.IndexOf(myXvar));
  }
  return IndexList ;
}

例如:如果我有10个对象,其中一个我做了两次克隆,我将有12个对象,并且两个克隆的索引都相同(它们不在同一个索引上) ,函数IndexOf返回相同的一个)

我该怎么办?

修改

public x Clone()
    {
        x clone = new x(Int32.Parse(this.Name.Split(new char[1] { ' ' })[1]) + 1);
        clone.Copy(this);
        return clone;
    }

2 个答案:

答案 0 :(得分:2)

引自MSDN(强调我自己):

  

搜索指定的对象并返回从零开始的索引   列表中元素范围内的第一次出现   从指定的索引扩展到最后一个元素。

它们基本匹配第一次出现。这归结为List<>中您拥有的项目的相等性,它使用默认的相等比较器:

  

此方法使用默认的相等比较器确定相等性   EqualityComparer.Default for T,列表中值的类型。

http://msdn.microsoft.com/en-us/library/e4w08k17.aspx

您可以使用带有起始索引的覆盖来排除搜索中的先前索引:

http://msdn.microsoft.com/en-us/library/s8t42k5w.aspx

或者,如果您想根据哈希和相等性保留唯一项目,请改用HashSet<T>

我考虑过提供代码示例,但是当我查看您提供的代码时,它的意义越来越少。您当前的示例将按索引顺序循环项目并将索引添加到另一个列表,仅针对重复项目它将是相同的索引。退后一步, 你想要达到什么目标? 我感觉那里有更好的选择。

答案 1 :(得分:0)

问题是我没有做两次克隆,

我拿了同一个对象并将其放在列表中两次,

我做完两次克隆后问题解决了。

(对不起,这不是一个问题,你无法分辨。)