请教大哥:这程序写得太难看,如何取消goto却能实现同样的功能?教课书上都说尽量不用goto,下面一般程序遍历分类列表,获得当前类别的
顶层编号(父编号=0),如果不用goto还真想不出来怎么弄?各位大哥看看能不能不用goto,这程序写得真是太难看了,而且很容易落入
死循环。。
        /// <summary>
        /// 取得组别编号(顶层的分类编号)
        /// </summary>
        public static string GetGroupID(string orgClassId)
        {
            string groupID = string.Empty;
            string classId = orgClassId;
            XX:
                foreach (PubClassInfo o in NewsClass)
                {
                    // 如果是顶层分类编号则返回
                    if (o.ClassID.Equals(classId) && o.ParentID.Equals("0"))
                    {
                        groupID =  o.ClassID;
                        break;
                    }                    if (o.ClassID.Equals(classId))
                    {
                        classId = o.ParentID;
                        goto XX;
                    }                }
            return groupID;
        }

解决方案 »

  1.   

    continue
    是继续循环, 这个在这里不能用的... 因为得不出正确的结果.....
      

  2.   

    /// <summary> 
    /// 取得组别编号(顶层的分类编号) 
    /// </summary> 
    public static string GetGroupID(string orgClassId) 

      string groupID = string.Empty; 
      string classId = orgClassId; 
      PubClassInfo o;
      for (o = GetPubClassInfoByClassId(orgClassId); !o.ParentID.Equals("0"); o = GetPubClassInfoByClassId(o.ParentID));
      return o.ClassID; 
    }static PubClassInfo GetPubClassInfoByClassId(string classId)
    {
      foreach (PubClassInfo o in NewsClass) 
      { 
        if (o.ClassID.Equals(orgClassId)) return o;
      }
      return null;
    }
            
      

  3.   

    /// <summary> 
    /// 取得组别编号(顶层的分类编号) 
    /// </summary> 
    public static string GetGroupID(string orgClassId) 

      string groupID = string.Empty; 
      PubClassInfo o;
      for (o = GetO(orgClassId); !o.ParentID.Equals("0"); o = GetO(o.ParentID));
      return o.ClassID; 
    }static PubClassInfo GetO(string classId)
    {
      foreach (PubClassInfo o in NewsClass) 
      { 
        if (o.ClassID.Equals(classId)) return o;
      }
      return null;
    }
            
      

  4.   

    /// <summary> 
    /// 取得组别编号(顶层的分类编号) 
    /// </summary> 
    public static string GetGroupID(string orgClassId) 

      PubClassInfo o;
      for (o = GetO(orgClassId); !o.ParentID.Equals("0"); o = GetO(o.ParentID));
      return o.ClassID; 
    }static PubClassInfo GetO(string classId)
    {
      foreach (PubClassInfo o in NewsClass) 
      { 
        if (o.ClassID.Equals(classId)) return o;
      }
      return null;
    }
      

  5.   


    //用递归  大概是这意思 程序没编译 有错见谅  /// <summary> 
            /// 取得组别编号(顶层的分类编号) 
            /// </summary> 
            public static string GetGroupID(string orgClassId) 
            { 
                string groupID = getGroupID(orgClassId,""); 
                
            }
    static string getGroupID(string classId ,string groupid){
                   string groupID =groupid;
                    foreach (PubClassInfo o in NewsClass) 
                    { 
                        // 如果是顶层分类编号则返回 
                        if (o.ClassID.Equals(classId) && o.ParentID.Equals("0")) 
                        { 
                            groupID =  o.ClassID; 
                            break; 
                        }                     if (o.ClassID.Equals(classId)) 
                        { 
                            classId = o.ParentID; 
                            groupID=getGroupID(classId ,groupid);
                        }                 } 
                return groupID; }
      

  6.   


    //名字跟你的重了 呵呵 改下
    //用递归  大概是这意思 程序没编译 有错见谅  /// <summary> 
            /// 取得组别编号(顶层的分类编号) 
            /// </summary> 
            public static string GetGroupID(string orgClassId) 
            { 
                string groupID = getGroupID2orgClassId,""); 
                
            }
    static string getGroupID2string classId ,string groupid){
                   string groupID =groupid;
                    foreach (PubClassInfo o in NewsClass) 
                    { 
                        // 如果是顶层分类编号则返回 
                        if (o.ClassID.Equals(classId) && o.ParentID.Equals("0")) 
                        { 
                            groupID =  o.ClassID; 
                            break; 
                        }                     if (o.ClassID.Equals(classId)) 
                        { 
                            classId = o.ParentID; 
                            groupID=getGroupID(classId ,groupid);
                        }                 } 
                return groupID; }
      

  7.   


    //用递归  大概是这意思 程序没编译 有错见谅  /// <summary> 
            /// 取得组别编号(顶层的分类编号) 
            /// </summary> 
            public static string GetGroupID(string orgClassId) 
            { 
                string groupID = getGroupID2(orgClassId,""); 
                
            }
    static string getGroupID2(string classId ,string groupid){
                   string groupID =groupid;
                    foreach (PubClassInfo o in NewsClass) 
                    { 
                        // 如果是顶层分类编号则返回 
                        if (o.ClassID.Equals(classId) && o.ParentID.Equals("0")) 
                        { 
                            groupID =  o.ClassID; 
                            break; 
                        }                     if (o.ClassID.Equals(classId)) 
                        { 
                            classId = o.ParentID; 
                            groupID=getGroupID(classId ,groupid);
                        }                 } 
                return groupID; }
      

  8.   

    递归可以用. 但听说层次太深的话, 容易引发: StackOverflowException 错误大家还有无其他解法????谢谢各位指教....
      

  9.   

    使用While解决            bool isContinue=true;
                while (isContinue)
                {
                    foreach (PubClassInfo o in NewsClass)
                    {
                        // 如果是顶层分类编号则返回 
                        if (o.ClassID.Equals(classId) && o.ParentID.Equals("0"))
                        {
                            groupID = o.ClassID;
                            isContinue = false;
                            break;
                        }                    if (o.ClassID.Equals(classId))
                        {
                            classId = o.ParentID;
                            break;
                        }                }
                }
      

  10.   

    嗯, 用 while 循环的方法好些, 试着写一个
    btw. string.Equals 有什么好? 我看着很不习惯public static string GetGroupID(string orgClassId)
    {
        string class_id = orgClassId;     while (true) {
            foreach (PubClassInfo c in NewsClass) {
                if (c.ClassID == class_id) {
                    if (c.ParentID == "0") {
                        return c.ClassID;
                    }                class_id = c.ParentID;
                    break;
                }
            }
        }
    }
      

  11.   

      /// <summary> 
            /// 取得组别编号(顶层的分类编号) 
            /// </summary> 
            public static string GetGroupID(string orgClassId) 
            { 
                string groupID = string.Empty; 
                string classId = orgClassId; 
                XX: 
                    foreach (PubClassInfo o in NewsClass) 
                    { 
                        // 如果是顶层分类编号则返回 
                        if (o.ClassID.Equals(classId) && o.ParentID.Equals("0")) 
                        { 
                            groupID =  o.ClassID; 
                            break; 
                        }                     if (o.ClassID.Equals(classId)) 
                        { 
                            classId = o.ParentID; 
                           GetGroupID(orgClassId);// goto XX; 
                        }                 } 
                return groupID; 
            }
      

  12.   

    我碰到的 StackOverflowException 大多是因为递归结束条件没有写好, 导致无限递归, 正常情况下应该不用担心这个问题