0

我有一个非常相似的功能,只有一个以前的报告和另一个未来,我怎样才能优化和写漂亮?

public bool AnyPreviousReportByGroup(int groupID)
        {
            if(this.GroupID == groupID)
            {
                return true;
            }
            else
            {
                return PreviousReport.AnyPreviousReportByGroup(groupID);
            }
        }

        public bool AnyNextReportByGroup(int groupID)
        {

            if (this.GroupID == groupID)
            {
                return true;
            }
            else
            {
                return NextReport.AnyNextReportByGroup(groupID);
            }
        }
4

5 回答 5

1

以下代码是实现相同目的的更简洁的方法:

public bool AnyPreviousReportByGroup(int groupID)
{
    return this.GroupID == groupID ||
           this.PreviousReport != null &&
           this.PreviousReport.AnyPreviousReportByGroup(groupID);
}

如果你真的想使用 lambda 表达式,这里有一个可能的方法:

public bool AnyReportByGroup(int groupID, Func<Report, Report> getOtherReport)
{
    if (this.GroupID == groupID)
        return true;

    Report other = getOtherReport(this);
    return other != null &&
           other.AnyReportByGroup(groupID, getOtherReport);
}

然后,您可以使用 lambda 表达式调用此辅助方法:

bool anyPrevious = this.AnyReportByGroup(groupID, report => report.PreviousReport);
bool anyNext = this.AnyReportByGroup(groupID, report => report.NextReport);
于 2012-11-20T10:50:08.160 回答
1
private bool AnyReportByGroup(int groupID, Func<int, bool> callback)
{

    if (this.GroupID == groupID)
    {
        return true;
    }
    else
    {
        return callback(groupID);
    }
}

public bool AnyPreviousReportByGroup(int groupID)
{
    return AnyReportByGroup(groupID, gid => PreviousReport.AnyPreviousReportByGroup(gid));
}

public bool AnyNextReportByGroup(int groupID)
{
    return AnyReportByGroup(groupID, gid => NextReport.AnyNextReportByGroup(gid));
}

但是,我希望这些方法只是一个示例,在您的真实代码中它们更复杂。
否则,我无法理解,您尝试优化什么。

于 2012-11-20T10:56:07.627 回答
0

可能是这样的

public enum ReportType{ Next, Previous }

public bool AnyReportByGroup(int groupID, ReportType type)
{
  if(this.GroupID == groupID)
      return true;
  else
  {
      switch(type)
      {
          case ReportType.Next:
            return NextReport.AnyNextReportByGroup(groupID);
          case ReportType.Previous:
            return NextReport.AnyPreviousReportByGroup(groupID);
      }
      return false;
  }
}
于 2012-11-20T10:51:36.677 回答
0

遍历链表的标准方法如下:

    public bool AnyPreviousReportByGroup(int groupID)
    {
        var item = this;
        do
        {
            if (item.GroupId == groupID)
            {
                return true;
            }
            item = item.PreviousReport;
        } while (item != null);
        return false;
    }

    public bool AnyNextReportByGroup(int groupID)
    {
        var item = this;
        do
        {
            if (item.GroupId == groupID)
            {
                return true;
            }
            item = item.NextReport;
        } while (item != null);
        return false;
    }

这样做的好处是不会像递归方法那样创建潜在的大量调用堆栈。

这也修复了您的代码,它从不返回错误,它只是 NPE。

现在我们可以按照您的要求进行重构:

    private bool AnyReportByGroup(int groupID, bool searchForward)
    {
        var item = this;
        do
        {
            if (item.GroupId == groupID)
            {
                return true;
            }
            item = searchForward ? item.NextReport : item.PreviousReport;
        } while (item != null);
        return false;
    }

    public bool AnyPreviousReportByGroup(int groupID)
    {
        return AnyReportByGroup(groupID, false);
    }

    public bool AnyNextReportByGroup(int groupID)
    {
        return AnyReportByGroup(groupID, true);
    }
于 2012-11-20T11:11:04.343 回答
0

这是一个非递归解决方案,假设您想在false报告用完时返回:

public bool AnyPreviousReportByGroup(int groupID)
{
    return GetEventualValue(groupID, r => r.PreviousReport);
}

public bool AnyNextReportByGroup(int groupID)
{
    return GetEventualValue(groupID, r => r.NextReport);
}

public bool GetEventualValue(int groupID, Func<Report, Report> nextReport)
{
    Report report = this;
    while (report != null && report.GroupID != groupID)
    {
        report = nextReport(report);
    }
    return report != null;
}
于 2012-11-20T11:13:49.110 回答