2010-05-17 47 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