自分の中で「クエリ式と標準クエリ演算子の互換」ができてない。もしくはできない互換をできると勘違いしているのかもしれない。
class Program { static void Main( string[] args ) { XDocument doc = XDocument.Load( @"plants.xml" ); var all = from plant in doc.Root.Elements() orderby plant.Element( "Power" ).Value select new { Name = plant.Element( "Name" ).Value, Power = plant.Element( "Power" ).Value }; var all2 = doc.Root.Elements() .Where( plant => plant.HasElements ) .OrderBy( power => power.Element( "Power" ).Value ) .Select( plant => plant.Elements() ) .Distinct(); foreach ( var el in all ) Console.WriteLine( "{0}({1})", el.Name, el.Power ); Console.WriteLine(); foreach ( var el in all2 ) Console.WriteLine( "{0}({1})", el.Elements().Select( name => name.Element( "Name" ).Value ), el.Elements().Select( power => power.Element( "Power" ).Value ) ); Console.WriteLine( "Press any key to exit..." ); Console.ReadKey(); } }
浜岡原子力(110000) 東海第二(110000) 福島第二原子力(110000) 福島第二原子力(110000) 玄海原子力(55900) 伊方(56600) 伊方(56600) 泊(57900) 泊(57900) 福島第一原子力(78400) 福島第一原子力(78400) 島根原子力(82000) 巻原子力(82500) 女川原子力(82500) 女川原子力(82500) // 適当に省略 高浜(82600) 高浜(82600) 美浜(82600) 浜岡原子力(84000) 高浜(87000) 高浜(87000) 川内原子力(89000) 川内原子力(89000) 伊方(89000) System.Linq.Enumerable+<SelectIterator>d__d`2[System.Xml.Linq.XElement,System.St ring](System.Linq.Enumerable+<SelectIterator>d__d`2[System.Xml.Linq.XElement,Sys tem.String]) // 省略 System.Linq.Enumerable+<SelectIterator>d__d`2[System.Xml.Linq.XElement,System.St ring](System.Linq.Enumerable+<SelectIterator>d__d`2[System.Xml.Linq.XElement,Sys tem.String]) Press any key to exit...
こうやって構造体で拾ってくるコードを書いたときに、これを標準クエリ演算子で書くとどうなるかわからん。いけそうだけどいけてない。単純にNameを取ってくるのと、Powerをとってくるので書かないといけないのか、それとも一緒に書けるのか。
あと微妙にソートできてない気がするんだけど、これは。。。
追記
ソートは、OrderByしてるとろころ(Element( "Power" ).value)がString型だったからちゃんとできてなかった。
class Program { static void Main( string[] args ) { XDocument doc = XDocument.Load( @"plants.xml" ); var all = from plant in doc.Root.Elements() orderby int.Parse( plant.Element( "Power" ).Value ) descending select new { Name = plant.Element( "Name" ).Value, Power = plant.Element( "Power" ).Value }; var all2 = doc.Root.Elements() .Where( plant => plant.HasElements ) .OrderByDescending( power => int.Parse( power.Element( "Power" ).Value ) ) .Select( plant => plant.Element( "Name" ).Value) .Distinct(); foreach ( var el in all ) Console.WriteLine( "{0}({1})", el.Name, el.Power ); Console.WriteLine(); foreach ( var el in all2 ) Console.WriteLine( el ); Console.WriteLine( "Press any key to exit..." ); Console.ReadKey(); } }
柏崎刈羽原子力(135600) 柏崎刈羽原子力(135600) 玄海原子力(118000) // 省略 敦賀(35700) 美浜(34000) 東海(16600) 柏崎刈羽原子力 玄海原子力 // 省略 泊 志賀原子力 東海 Press any key to exit...
クエリ式の方は 重複対処ができてないから、ソートできてないように見えるけどできてる。