2010-05-17 121 views
1

標題並不完全有意義,但我不會分享其他名稱。我稍後寫了一個TOC Generation代碼。基於此,我正在編寫代碼來檢查重複項。代碼如下所示代碼的替代實現方式

curNumber = getTOCReference(selItem.SNo, IsParent); 
CheckForDuplicates(curNumber, IsParent,out realTOCRef); 
curNumber = realTOCRef; 

而對於CheckForDuplicates代碼

 ListViewItem curItem = this.tlvItems.FindItemWithText(curNumber); 

     if (curItem != null) 
     { 
      curNumber = this.getTOCReference(curNumber, !IsParent); 
      CheckForDuplicates(curNumber, IsParent,out realTOCRef); 
     } 
     else 
     { 
      realTOCRef= curNumber; 
     } 

這個代碼做什麼,它得到一個TOC,並試圖找到它,如果它已經在ObjectListView存在,並且獲得新的TOC如果有現有的TOC。一旦它確定生成的TOC不在列表中,它會將其存儲在realTOCRef中並將其發送回主調用代碼。

我用「out」返回最後生成的TOC,這是我不想做的事情。我之所以這麼做是因爲生成了非重複的TOC之後,返回結果並沒有返回到調用代碼,而是循環遍歷之前的實例,然後返回。當發生環回時,要返回的TOC也被重置。

我將不勝感激任何幫助。

+0

問題不是很清楚。我希望你正在尋找重構CheckForDuplicates代碼並按如下方式進行調用。 -------------- 現有的: CheckForDuplicates(curNumber,IsParent,out realTOCRef); curNumber = realTOCRef; ----------- 必需: curNumber = CheckForDuplicates(curNumber,IsParent); – 2010-05-22 04:15:07

回答

2

當您有一個輸出參數時,通常可以通過使用該值作爲該方法的返回值來刪除它。更換了參數;這裏的返回值如下:

String CheckForDuplicates(String curNumber, bool IsParent) 
{ 
    ListViewItem curItem = this.tlvItems.FindItemWithText(curNumber); 

    if (curItem != null) 
    { 
     String newNumber = this.getTOCReference(curNumber, !IsParent); 
     curNumber = CheckForDuplicates(newNumber, IsParent); 
    } 
    // else - curNumber is correct - not a duplicate 
    return curNumber; 
} 

至於設計,我覺得這個代碼應該是你getTOCReference的一部分,使得客戶不必擔心重複數據刪除 - 它是有道理的使重複數據刪除功能成爲getTOCReference的基本功能的一部分。它沒有什麼複雜的 - 只是有點重命名和膠水:

  • 命名getTOCReferencegetNextTOCReference,因爲這真的是它 - 發現TOC值會來下一次,不檢查重複。
  • 創建一個新方法GetNextAvailableTOCRefernece。對我來說GetTOCRefernece意味着retreiving某種保存的狀態,多個調用會返回相同的值。這不是它的作用,所以這個新名字說得很清楚。它看起來像這樣:

(基本上是你給在頁面頂部的代碼,重構使用返回值,包在一個方法。)

String GetNextAvailableTOCReference(String curNumber, bool IsParent) 
{ 
    String newNumber = GetNextTOCRefrence(curNumber, IsParent); 
    return CheckForDuplicates(newNumber, IsParent); 
} 

有了這些變化,你叫getNextAvailalbeTOCreference當你需要一個新的參考,你可以確定它是唯一的(沒有重複。)

我已經離開了代碼風格 - 我同意你可以更一致一些,並提供一些邏輯的評論 - 特別是getTOCReference,因爲根據方法參數做4種不同的事情。當然,單元測試可以確保它能夠做到你所說的那樣!

+0

感謝mdma :)工作。 – vikramjb 2010-05-24 11:00:00

0

我不確定你在找什麼。

我認爲你正在尋找像下面這樣的東西。

現有的呼叫:

CheckForDuplicates(curNumber, IsParent,out realTOCRef); 
curNumber = realTOCRef; 

所需的呼叫:

curNumber =CheckForDuplicates(curNumber, IsParent); 

如果是的話,簡單的修改代碼如下它將工作。

 ListViewItem curItem = this.tlvItems.FindItemWithText(curNumber); 

     if (curItem != null) 
     { 
      curNumber = this.getTOCReference(curNumber, !IsParent); 
      return CheckForDuplicates(curNumber, IsParent); 
     } 
     else 
     { 
      return curNumber; 
     } 
+0

沒有工作。可能是因爲同一個問題。發生的事情是,如果循環運行一次,我們有一個拷貝curNumber和多於循環,它爲每個循環創建一個單獨的副本,當遇到第一個返回時,它返回到curNumber的舊副本並返回該副本。那麼我想這就是我所知道的情況。感謝您的回覆sachin :) – vikramjb 2010-05-24 09:59:35

+0

是第一部分正確,我認爲你正在尋找一個函數,將是 curNumber = CheckForDuplicates(curNumber,IsParent); – 2010-05-24 10:25:18

+0

我想要返回最後一個循環中分配的curNumber。在這種情況下,它不是。 mdma有正確的答案。重構代碼的時間。 – vikramjb 2010-05-24 11:04:09