繁体   English   中英

List.Add似乎是重复条目。 怎么了?

[英]List.Add seems to be duplicating entries. What's wrong?

我有一个这样的课:

public class myClass
{
  public List<myOtherClass> anewlist = new List<myOtherClass>;

  public void addToList(myOtherClass tmp)
  {
    anewList.Add(tmp);
  }

}

所以我将“addToList”称为100次,每次都向列表中添加一个唯一的项目。 我测试了我的项目以显示在运行“addToList”方法之前,它们是唯一的。 我甚至插了一行来测试“tmp”,以确保它是我所期待的。

但是,当我这样做时(假设myClass对象被称为tmpClass):

int i = tmpClass.anewList.Count();
for (int j = 0; j<i; j++)
{
   //write out each member of the list based on index j...
}

我得到了同样的确切项目,这是写入我列表的最后一项。 就像我添加时一样,我用我添加的最后一项覆盖了整个列表。

救命? 这毫无意义。 我也尝试过List.Insert,我总是在最后插入或在索引0处插入。仍然没有骰子。 是的,我是双重来源我的索引是正确的,当我做我的测试时,我正在索引每个元素。

:)

更新:好的,我试过这个但仍然有同样的问题:

foreach(myOtherClass tmpC in tmpClass.anewList)
{    
    Console.WriteLine(tmpC.theStringInMyClass.ToString());
}

并且对于100个项目中的每一个,我得到了相同的字符串输出...我确定我做的事情完全是愚蠢的,但我不知道还有什么。 我仍然100%确定正确的字符串开始传入。

-Adeena


好的,我试过这个但仍然有同样的问题:

foreach(myOtherClass tmpC in tmpClass.anewList)
{
    Console.WriteLine(tmpC.theStringInMyClass.ToString());
}

并且对于100个项目中的每一个,我得到了相同的字符串输出...我确定我做的事情完全是愚蠢的,但我不知道还有什么。 我仍然100%确定正确的字符串开始传入。

-Adeena

给定addToList方法的签名:

public void addToList(myOtherClass tmp)
  {
    anewList.Add(tmp);
  }

是否有可能在该方法的使用者中,您实际上并未创建新实例?

你说你正在调用addToList 100次。 据推测,这是一个循环。 在每次循环迭代中,您将需要创建一个“myOtherClass”的新实例,否则,您将只更新内存中的同一对象。

例如,如果您执行以下操作,则将拥有同一对象的100个副本:

myOtherClass item = new myOtherClass();

for(int i=0; i < 100; i++)
{
  item.Property = i;
  addToList(item);
}

但是,如果您的循环如下所示,它将正常工作:

myOtherClass item = null;
for(int i=0; i < 100; i++)
{
  item = new myOtherClass();
  item.Property = i;
  addToList(item);
}

希望有所帮助!

在这种情况下,查看如何验证每个项目以确保项目是唯一的可能会有所帮助。 如果您可以显示类的ToString()方法,那么它可能会有所帮助:您可能会将它基于每个对象之间实际相同的内容。 这可能有助于确定您是否每次都获得相同的对象,或者所考虑的部分是否真的不是唯一的。

此外,您应该尽可能使用foreach循环,而不是通过索引访问。

最后,列表中的项目不是普遍唯一的,而是对其他地方存在的对象的引用。 如果您尝试检查检索到的项目相对于外部对象是唯一的,那么您将失败。

还有一件事,我想:您可能希望将anewList上的访问权限设为私有而非public

尝试使用foreach而不是索引来遍历列表。 我怀疑问题出在您从示例中省略的代码中,而不是列表本身。

foreach (MyOtherClass item in tmpClass.anewList)
{
     Console.WriteLine( item );  // or whatever you use to write it
}

编辑

您是否检查了调试器中的列表结构以确保实际添加了您的唯一项? 此外,您可能希望使用.Count (属性)而不是.Count() (扩展方法)。 扩展方法实际上可以迭代列表来计算方法,而属性只是查找保存计数的私有变量的值。

@James可能会在这里发表意见。 如果您只是更改已插入项目的属性并重新插入它,而不是每次都创建一个新对象,这将导致您看到的行为。

好吧,从我在这里读到,我认为你的问题可能是在列表中添加项目 - 你确定,你不是一次又一次地添加相同的参考? 这可能是理由,为什么列表中有100个“最后一项”。

另请注意,当您使用确切的表单时:

 for (int j = 0; j < tmpClass.anewList.Count(); j++)

C#编译在循环上执行特殊优化。 如果您改变了语法(例如,通过将Count属性从循环中拉出到单独的变量中,就像您在示例中所做的那样),则编译会跳过该优化。

它不会影响显示的内容,但需要更长时间。

得到它了! 谢谢詹姆斯 -

这是我做错的蠢事:

我有:

myClass tmpClass = new myClass();
myOtherClass anewitem = new myOtherClass();
string tst = "";

for (int i = 0; i < 100; i++) 
{
    tst += "blah";
    anewitem.theStirngInMyClass = tst;
    tmpClass.AddToList(anewitem);
}

当我改变它是这样的:

myClass tmpClass = new myClass();
string tst = "";

for (int i = 0; i < 100; i++) 
{
    myOtherClass anewitem = new myOtherClass()
    tst += "blah";
    anewitem.theStringInMyClass = tst;
    tmpClass.AddToList(tst);
}

一切都好。 我知道了。 :)

谢谢你的帮助!

-Adeena

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM