我有一个列表,其中包含许多来自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;
}
答案 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)
问题是我没有做两次克隆,
我拿了同一个对象并将其放在列表中两次,
我做完两次克隆后问题解决了。(对不起,这不是一个问题,你无法分辨。)