C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: LINQの使い方


(過去ログ 61 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■35299 / inTopicNo.1)  LINQの使い方
  
□投稿者/ SS (1回)-(2009/04/23(Thu) 19:00:22)

分類:[.NET 全般] 

VS2008(C#)

TreeViewのノードのFullPathをまとめたList<string>があります。
このList<string>を使って、指定したノードにぶら下がるリーフノードを抽出したいのですが、
LINQではどのように記述すればよいでしょうか?

"1"
"1/11"
"1/11/111"
"1/12"
"1/12/121"
"1/12/122"
"2"
"2/21"
"2/21/211"
"2/21/212"
"2/21/213"
"2/22"
"2/22/221"

上記のリストで、例えば"1"を指定したときは、
"1/11/111"
"1/12/121"
"1/12/122"
の3つが結果として返って欲しいのですが。

よろしくお願いします。
引用返信 編集キー/
■35301 / inTopicNo.2)  Re[1]: LINQの使い方
□投稿者/ 渋木宏明(ひどり) (1126回)-(2009/04/23(Thu) 19:22:24)
渋木宏明(ひどり) さんの Web サイト
> TreeViewのノードのFullPathをまとめたList<string>があります。

あまり扱いやすいデータ構造とは言えないですね。
むしろ、TreeNode を直接検索したほうがてっとり早いと思いますけど、それじゃだめなんですか?

引用返信 編集キー/
■35302 / inTopicNo.3)  Re[1]: LINQの使い方
□投稿者/ .SHO (813回)-(2009/04/23(Thu) 20:34:31)
LINQじゃないとダメですか?
正規表現の方が簡単そうだけど。。
引用返信 編集キー/
■35304 / inTopicNo.4)  Re[2]: LINQの使い方
□投稿者/ SS (2回)-(2009/04/23(Thu) 20:45:29)
LINQでなくても構いません。
効率のよい方法がありましたら教えてください。
お願いします。
引用返信 編集キー/
■35306 / inTopicNo.5)  Re[3]: LINQの使い方
□投稿者/ .SHO (814回)-(2009/04/23(Thu) 21:01:52)
List<string>のデータの頭とお尻にも / を付ける仕様にすれば
"1" を指定したときは "/1/" の正規表現で検索すればいいだけ。
引用返信 編集キー/
■35307 / inTopicNo.6)  Re[4]: LINQの使い方
□投稿者/ επιστημη (1898回)-(2009/04/23(Thu) 21:38:56)
επιστημη さんの Web サイト
List<string> 作らんでも TreeNodeを列挙する際に拾い出せるっしょ。

void walk(TreeNode node) {
  if ( nodeが目的のもの ) {
    見つけた時の処理
  }
  foreach ( TeeeNode child in node.Nodes ) {
    walk(child);
  }
}
 

引用返信 編集キー/
■35309 / inTopicNo.7)  Re[1]: LINQの使い方
□投稿者/ よねKEN (323回)-(2009/04/24(Fri) 00:32:32)
> TreeViewのノードのFullPathをまとめたList<string>があります。

そもそもTreeViewにはFullPathの値から該当のTreeNodeを一発で取得する方法がないんじゃないでしょうか。
なので、どのみちTreeNode一つ一つを調べる必要があるかと思います。

あるいは、今はツリーが作成されるタイミング、及び、ノードが追加されるタイミングに、
Dictionary<string, TreeNode>でFullPathとTreeNodeの対応表を作っておくとか。
#途中のノードが削除される場合やノードの移動を考慮しないといけない場合には、
#Dicitonay<string, TreeNode>のメンテが逆に面倒なので、限定的な条件でしか役立たないかも。
引用返信 編集キー/
■35316 / inTopicNo.8)  Re[2]: LINQの使い方
□投稿者/ SS (3回)-(2009/04/24(Fri) 11:09:49)
皆様ありがとうございます。
自分でもいろいろ考えてみましたが、素直にTreeNodeを検索することにします。
正規表現を使った方法は、いまいち理解できませんでした・・・。

List<string> tree = new List<string>();
tree.Add("1");
tree.Add("1/11");
tree.Add("1/11/111");
tree.Add("1/12");
tree.Add("1/12/121");
tree.Add("1/12/122");
tree.Add("2");
tree.Add("2/21");
tree.Add("2/21/211");
tree.Add("2/21/212");
tree.Add("2/21/213");
tree.Add("2/22");
tree.Add("2/22/221");

string findNode = "1";

var query = from n1 in tree
            where n1.StartsWith(findNode)
            from n2 in tree
            where n2.StartsWith(findNode)
            group n1 by (n2 + "/") into nodeGroup
            where nodeGroup.Where(x => x.StartsWith(nodeGroup.Key)).Count() == 0
            select nodeGroup.Key.TrimEnd('/');

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -