簡體   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