C#の初心者です。
以下のようなXML形式のデータがあります。
sample.txtという名前でCドライブ直下に保存してあります。
<resultset>
<result>
<title>123456789</title>
<id>{4E55D112-0048-E011-BC1D-00155D026322}</id>
<fullname>日本太郎</fullname>
<fullnamekana>ニホンタロウ</fullnamekana>
</result>
<result>
<title>123456789</title>
<id>{4E55D112-0048-E011-BC1D-00155D026322}</id>
<fullname>日本次郎</fullname>
<fullnamekana>ニホンジロウ</fullnamekana>
<telephone>000-0000-1111</telephone>
</result>
<result>
<title>123456789</title>
<id>{4E55D112-0048-E011-BC1D-00155D026322}</id>
<fullname>日本三郎</fullname>
<fullnamekana>ニホンサブロウ</fullnamekana>
</result>
</resultset>
御覧の通り、resultset要素の中にresult要素が3つあります。
しかしながらresult要素の中にあるいくつかの要素の数は可変です。
この例では、1番目と3番目のresult要素の中の要素はまったく同じものですが、2番目のresultの中の要素はtelephoneという他のresult要素内にはない要素が存在します。
私はこの3つのresult要素の中から、最大の要素数を含むresult要素のみを取得したいと思っております。
この例では、2番目のresult要素が一番たくさん要素を含んでいるので(telephone分)、希望結果は以下のような感じです。
<result>
<title>123456789</title>
<id>{4E55D112-0048-E011-BC1D-00155D026322}</id>
<fullname>日本次郎</fullname>
<fullnamekana>ニホンジロウ</fullnamekana>
<telephone>000-0000-1111</telephone>
</result>
これを実現するため、私は以下のようなコードを考えました。
(頭が悪いので、かなり時間がかかりました・・・)
StreamReader sample = new StreamReader(@"C:\sample.txt");
var XmlResult = XElement.Parse(sample.ReadToEnd());
var resultElementsMaxValue = (
from result in XmlResult.Elements("result")
select new { resultElementsCounts = result.Elements().Count() }
).Max(c => c.resultElementsCounts);
var modelResult = from result in XmlResult.Elements("result")
where result.Elements().Count().Equals(resultElementsMaxValue)
select result;
しかしながら、この方法では、result内要素数の一度MAX値を取得した後、そのMAX値で再度、MAX値と同じ数の要素を含むresult要素を検索しております。
これは効率が悪い気がします。
MAX値を取得したときと同じタイミングで、そのresult要素を取得する方法はないのでしょうか。
ご教授、よろしくお願いします。
No.2ベストアンサー
- 回答日時:
あ、ANo.1だと複数要素を返さないですね。
複数返すようにすると、こうかな:
var rs = XmlResult.Elements( "result" ).Select( it => new { n = it.Elements().Count(), v = it } ).ToArray();
var resultElementsMaxValue = rs.Max( it => it.n );
var modelResult = rs.Where( it => it.n == resultElementsMaxValue ).Select( it => it.v );
質問文のとあんまり変わらないので、あえて1回ですますものとして、こうとか:
var resultset = XmlResult.Elements( "result" );
var num_result= resultset.Count();
var rs = new XElement[ num_result ];
int num_rs = 0, max_num_elem_result = -1;
foreach ( var result in resultset ){
int num_elem_result = result.Elements().Count();
if ( num_elem_result < max_num_elem_result ){ continue; }
if ( num_elem_result > max_num_elem_result ){ num_rs = 0; max_num_elem_result = num_elem_result; }
rs[ num_rs++ ] = result;
}
Array.Resize( ref rs, num_rs );
foreach ( var result in rs ){ System.Console.WriteLine( result ); }
全然LINQじゃなくなってますが。
No.1
- 回答日時:
ググってみた感じだと、こんなのとか:
var r1 = ( from result in XmlResult.Elements( "result" )
select new { n = result.Elements().Count(), v = result }
).Aggregate( (reg, it) => it.n > reg.n ? it : reg ).v;
System.Console.WriteLine( r1 );
でも、こっちのほうが効率的かもしれない:
int max_nelem = -1; XElement r2 = null;
foreach ( var it in XmlResult.Elements( "result" ) ){
int c = it.Elements().Count();
if ( c > max_nelem ){ max_nelem = c; r2 = it; }
}
System.Console.WriteLine( r2 );
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- PHP php テーブルが作成できない 1 2022/11/17 23:41
- MySQL php テーブルを作れない 2 2022/11/17 18:22
- PHP php エラー 2 2022/10/23 16:43
- PHP PHP一覧表示した項目にリンクをはりたい 1 2023/07/12 17:08
- その他(プログラミング・Web制作) python OpenPyXLを使って出力結果をエクセルに書き込み 2 2022/06/04 19:46
- 英語 英訳に対する評価お願いします。(what疑問文) 4 2023/02/09 19:37
- MySQL SQL任意に並び替えをしたい 2 2023/08/28 10:47
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript console.logがどうしても2つ機能しないのでアドバイスをくださいお願いします 2 2022/07/07 22:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Listからのnull要素を削除方法は?
-
ASP.NETでツリービューを作成し...
-
東芝のDynabookなのですがアン...
-
XMLで要素が記述された順番に意...
-
CPUの考え方を教えてください ...
-
xmlファイルが上手にHTMLに変換...
-
XPathで途中に名前空間が設定さ...
-
XMLファイルの作り方がわかりま...
-
バッチファイルでテキストファ...
-
Visual Basic .NET の識別子は...
-
XMLとXSLTでリンクを張る方法
-
VB6.0でDOMを使用して...
-
VBでXMLファイルを作ると xmlns...
-
ルート要素ノードが2個ある場合?
-
VB6でXMLを作成しているのです...
-
スタイルシートを使用したXM...
-
4色定理はなぜグラフ理論で証...
-
UTF-8でエンコーディングとはど...
-
掲示板を作成する際、半角英数...
-
TreeViewに重複する値をセット
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
getElementsByNameの要素数が取...
-
head要素
-
Webページに関するさまざまな情...
-
ASP.NETでツリービューを作成し...
-
MFCでのタブコントロールに...
-
Listからのnull要素を削除方法は?
-
使用しない要素を無視するには...
-
2つの行動の違い
-
XPATHについて
-
hana no namae osiete kudasai.
-
element of surprise
-
大規模行列の計算
-
東芝のDynabookなのですがアン...
-
CPUの考え方を教えてください ...
-
XMLで要素が記述された順番に意...
-
昔Winnyってありましたけど、あ...
-
バッチファイルでテキストファ...
-
XML、XSLTの適応エラー(IEから...
-
UTF-8でエンコーディングとはど...
-
SNMP リンクダウンとノードダ...
おすすめ情報