再帰的なツリー構造の順序表示とリストセットへの追加
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メソッドは次のノードを検索するメソッドであり,実際の状況に応じて自分で書く.
この再帰は最初の要素と最後の要素が再帰しないので、中間の各要素は次の要素を見つけて、再帰された各要素の次の要素を循環して追加し、繰り返している場合は追加しません.