我有一个这样的课程:
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
答案 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