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

时间:2008-12-07 15:25:09

标签: c# list

我有一个这样的课程:

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

  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

6 个答案:

答案 0 :(得分:14)

鉴于你的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);
}

希望有所帮助!

答案 1 :(得分:2)

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

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

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

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

答案 2 :(得分:1)

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

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

修改

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

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

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

答案 5 :(得分:0)

知道了!谢谢詹姆斯 -

这是我做错的蠢事:

我有:

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