【问题标题】:Two clone variables return the same index on a list两个克隆变量在列表中返回相同的索引
【发布时间】:2013-01-29 00:54:24
【问题描述】:

我有一个列表,其中包含 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;
    }

【问题讨论】:

  • 请展示x.Clone()的实现。
  • 是的,你是否也为 X 实现了 IEquatable?
  • @hodaya 代码示例看起来有点奇怪,这段代码的最终目标是什么?我觉得可能有更简单的方法可以满足您的要求。
  • 这不是我的代码,所以他们把它带给我,我无法更改。 (仅限使用)
  • X 类是否实现了 IEquatable?

标签: c# list clone


【解决方案1】:

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

我把同一个对象放在列表中两次,

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

(抱歉,这不是一个问题,你看不出来。)

【讨论】:

    【解决方案2】:

    引用自 MSDN(强调我自己的):

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

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

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

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

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

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

    或者,如果您想保存基于哈希和相等性的唯一项目,请改用HashSet&lt;T&gt;

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

    【讨论】:

    • 假设我不能做你带来的两个选项之一(原因现在没有改变)没有其他方法来获得真正的索引?
    • @HodayaShalom 您可以使用for 循环而不是foreach 来获取您正在迭代的项目的索引。我正在努力查看这段代码试图实现的目标。或者,如果您跟踪您在列表中的距离,IndexOf 覆盖选项将为您工作。
    • 解释为什么我不能使用它有点复杂,但我会尝试。基本上,我在转换器中通过转换器(根据我的列表)将行号添加到 wpf DataGrid 我有整个列表,并且只有一个应该有行号的项目。所以我不能使用你带来的建议,因为我还没有开始发送索引。
    • 默认的相等比较器比较 REFERENCES,所以如果类 X 没有实现 IEquatable,那么 OP 的代码应该可以工作(因为它应该通过比较引用而不是值来找到项目,并且引用是不同的通过克隆调用)。我得出的结论是,X 类有一个我们没有被告知的 IEquatable 实现。
    • 类 x 有一个 INotifyPropertyChange 实现
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2015-06-23
    • 1970-01-01
    • 2013-03-08
    相关资源
    最近更新 更多