再帰的なツリー構造の順序表示とリストセットへの追加

5625 ワード

 
   
 /// <summary>

        ///       by     2015/06/15

        /// </summary>

        /// <param name="lstNextItem">         </param>

        /// <param name="returnItem">        </param>

        public static void OrderLink(List<TLink> lstNextItem, List<TLink> returnItem) 

        {

            foreach (TLink link in lstNextItem)

            {

                if (link.LinkState != "E")

                {

                    if (returnItem.Find(x => { return x.LinkGuid == link.LinkGuid; }) == null)

                    {

                        returnItem.Add(link);

                    }

                }

            }

            foreach (TLink link in lstNextItem)

            {

                if (link.LinkState != "E")

                {

                    List<TLink> newLink = ListNextLink(link.LinkGuid);

                    OrderLink(newLink, returnItem);

                }

            }

        }



        public static List<TLink> ListNextLink(string linkGuid)

        {

            using (OracleConnection conn = new OracleConnection(TDataCore.mJkConnStr))

            {

                try

                {

                    List<TLink> lst = new List<TLink>();

                    conn.Open();



                    OracleCommand cmd = conn.CreateCommand();

                    cmd.CommandText = string.Format("select {0} from t_link where linkGuid in (select endLinkGuid from t_line where startLinkGuid=:linkGuid)", m_LinkField);

                    OracleParameter param = cmd.Parameters.Add(":linkGuid", OracleDbType.Varchar2);

                    param.Value = linkGuid;

                    using (OracleDataReader dr = cmd.ExecuteReader())

                    {

                        while (dr.Read())

                        {

                            lst.Add(GetLink(dr));

                        }

                    }

                    conn.Close();

                    return lst;

                    

                }

                catch (Exception ex)

                {

                    throw ex;

                }

                finally

                {

                    if (conn != null && conn.State != ConnectionState.Closed)

                    {

                        conn.Close();

                    }

                }

            }

        }
 
   

 

 

ここでListNextLinkメソッドは次のノードを検索するメソッドであり,実際の状況に応じて自分で書く.
この再帰は最初の要素と最後の要素が再帰しないので、中間の各要素は次の要素を見つけて、再帰された各要素の次の要素を循環して追加し、繰り返している場合は追加しません.