inohilog

/var/log/inohiro.log

クエリ式と標準クエリ演算子の互換

自分の中で「クエリ式と標準クエリ演算子の互換」ができてない。もしくはできない互換をできると勘違いしているのかもしれない。

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...

クエリ式の方は 重複対処ができてないから、ソートできてないように見えるけどできてる。