あ、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じゃなくなってますが。
ググってみた感じだと、こんなのとか:
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 );
お礼
osamuy様 ありがとうございます。 その方法で実現できそうです。