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

我有一个这样的课:

public class myClass { public List anewlist = new List; public void addToList(myOtherClass tmp) { anewList.Add(tmp); } } 

所以我称“addToList”为一百次,每次都在列表中添加一个唯一的项目。 我测试了我的项目以显示在运行“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); } 

希望有所帮助!

在这种情况下,查看如何validation每个项目以确保项目是唯一的可能会有所帮助。 如果您可以显示类的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