<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>icocTech &#187; ken</title>
	<atom:link href="http://icoctech.icoc.co.jp/blog/?author=15&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>http://icoctech.icoc.co.jp/blog</link>
	<description>株式会社アイコック　システム部の技術関連ブログ</description>
	<lastBuildDate>Mon, 01 Aug 2016 03:45:32 +0000</lastBuildDate>
	<language>ja</language>
		<sy:updatePeriod>hourly</sy:updatePeriod>
		<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=4.0</generator>
	<item>
		<title>.NETからWindows APIを使用する際の便利サイト</title>
		<link>http://icoctech.icoc.co.jp/blog/?p=903</link>
		<comments>http://icoctech.icoc.co.jp/blog/?p=903#comments</comments>
		<pubDate>Thu, 24 Sep 2015 05:28:01 +0000</pubDate>
		<dc:creator><![CDATA[ken]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://icoctech.icoc.co.jp/blog/?p=903</guid>
		<description><![CDATA[C#やVB.NETで開発をしていて、それほど頻度がある訳ではないのですが Windows APIを直接使用しないとできないような機能があります。 例えば、EXCELファイルをC#で作成してそのウィンドウを前面に 表示させ [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C#やVB.NETで開発をしていて、それほど頻度がある訳ではないのですが<br />
Windows APIを直接使用しないとできないような機能があります。</p>
<p>例えば、EXCELファイルをC#で作成してそのウィンドウを前面に<br />
表示させたい等、他のプロセスのウィンドウを操作する場合です。</p>
<p>こういったときによく利用させていただいているサイトがあります。</p>
<p><a title="http://pinvoke.net/index.aspx" href="http://pinvoke.net/index.aspx">http://pinvoke.net/index.aspx</a></p>
<p>です。数が膨大なので全部確認している訳ではないのですが、大体のAPIは<br />
ここにありそうです。</p>
<p>参考になれば幸いです。</p>
]]></content:encoded>
			<wfw:commentRss>http://icoctech.icoc.co.jp/blog/?feed=rss2&#038;p=903</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[C#] 開発メモ クラス検索のパフォーマンスについて</title>
		<link>http://icoctech.icoc.co.jp/blog/?p=825</link>
		<comments>http://icoctech.icoc.co.jp/blog/?p=825#comments</comments>
		<pubDate>Mon, 13 Jul 2015 05:44:16 +0000</pubDate>
		<dc:creator><![CDATA[ken]]></dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://icoctech.icoc.co.jp/blog/?p=825</guid>
		<description><![CDATA[現在開発中のC#のプロジェクトで静的フィールドのメモリ内に リストを持ち、必要に応じてメモリのリストよりクラスを検索して 返しているロジックがあります。 この検索ロジックですが、List&#60;T&#62;で持っており、L [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>現在開発中のC#のプロジェクトで静的フィールドのメモリ内に<br />
リストを持ち、必要に応じてメモリのリストよりクラスを検索して<br />
返しているロジックがあります。</p>
<p>この検索ロジックですが、List&lt;T&gt;で持っており、LINQのwhere句で<br />
検索を行っています。</p>
<p>もし遅いようであれば、リストをSortedListを使うなり、ListのBinarySearch<br />
を利用することで対応しようと思っていたのですが、せっかくなので<br />
多めのテストデータを使ってパフォーマンステストを実施してみました。</p>
<p>ここでデータは予めソートされていることを前提とします。</p>
<p>先に比較結果を記述します。</p>
<p>[リストへ100,000件追加]<br />
List型(1回目)：0.234秒<br />
List型(2回目)：0.234秒<br />
List型(3回目)：0.218秒<br />
SortedList型(1回目)：1.093秒<br />
SortedList型(2回目)：1.125秒<br />
SortedList型(3回目)：1.171秒</p>
<p>[100,000件から1件のレコードを1,000回検索]<br />
List型(LINQのwhere句)(1回目)：51.312秒<br />
List型(LINQのwhere句)(2回目)：51.171秒<br />
List型(LINQのwhere句)(3回目)：51.093秒<br />
List型(BinarySearch)(1回目)：0.015秒<br />
List型(BinarySearch)(2回目)：0.015秒<br />
List型(BinarySearch)(3回目)：0.015秒<br />
SortedList型(1回目)：0.015秒<br />
SortedList型(2回目)：0.015秒<br />
SortedList型(3回目)：0.015秒</p>
<p>この結果を見る限り、利用するならリストへの追加、検索の<br />
ともに速いList型のBinarySearchがよさそうです。</p>
<p>ただ、ここでは1レコードを取得するテストを行いましたが<br />
実際のプロジェクトでは範囲検索でリストを取得する処理も<br />
行っているので、若干工夫が必要になりそうです。</p>
<p>ちなみにSortedList型でLINQを使って同じように検索すると<br />
53.062秒と遅くなりました。LINQを使う場合はSortedListにしても<br />
変わりはないようです・・・</p>
<p>参考までにテストの際に使用したソースを以下に記述します。</p>
<p>[検索するクラス]<br />
public class Table<br />
{<br />
public String Key1 { get; set; }<br />
public String Key2 { get; set; }<br />
public String Key3 { get; set; }<br />
public String Key4 { get; set; }<br />
public String Key5 { get; set; }<br />
public String Value { get; set; }<br />
}</p>
<p>[比較用クラス]<br />
public class TableCompare : IComparer&lt;Table&gt;<br />
{<br />
public int Compare(Table x, Table y)<br />
{<br />
if (x.Key1 != y.Key1)<br />
{<br />
return String.Compare(x.Key1, y.Key1);<br />
}<br />
if (x.Key2 != y.Key2)<br />
{<br />
return String.Compare(x.Key2, y.Key2);<br />
}<br />
if (x.Key3 != y.Key3)<br />
{<br />
return String.Compare(x.Key3, y.Key3);<br />
}<br />
if (x.Key4 != y.Key4)<br />
{<br />
return String.Compare(x.Key4, y.Key4);<br />
}<br />
return String.Compare(x.Key5, y.Key5);<br />
}<br />
}</p>
<p>リストへの追加処理</p>
<p>[List型]<br />
List&lt;Table&gt; lstTable = new List&lt;Table&gt;();<br />
for (Int32 i = 0; i &lt; 100000; i++)<br />
{<br />
Table table = new Table();<br />
table.Key1 = &#8220;1&#8221;;<br />
table.Key2 = &#8220;2&#8221;;<br />
table.Key3 = &#8220;3&#8221;;<br />
table.Key4 = &#8220;4&#8221;;<br />
table.Key5 = String.Format(&#8220;{0:00000}&#8221;, i);<br />
table.Value = i.ToString();<br />
lstTable.Add(table);<br />
}</p>
<p>[SortedList型]<br />
SortedList&lt;Table, Table&gt; slstTable = new SortedList&lt;Table, Table&gt;(new TableCompare());<br />
for (Int32 i = 0; i &lt; 100000; i++)<br />
{<br />
Table table = new Table();<br />
table.Key1 = &#8220;1&#8221;;<br />
table.Key2 = &#8220;2&#8221;;<br />
table.Key3 = &#8220;3&#8221;;<br />
table.Key4 = &#8220;4&#8221;;<br />
table.Key5 = String.Format(&#8220;{0:00000}&#8221;, i);<br />
table.Value = i.ToString();<br />
slstTable.Add(table, table);<br />
}</p>
<p>検索の比較</p>
<p>[List型(LINQのwhere句)]<br />
for (Int32 i = 0; i &lt; 1000; i++)<br />
{<br />
Random rm = new Random(i);<br />
Int32 key = rm.Next(100000);</p>
<p>Table table = lstTable.Where(m =&gt;<br />
m.Key1 == &#8220;1&#8221;<br />
&amp;&amp; m.Key2 == &#8220;2&#8221;<br />
&amp;&amp; m.Key3 == &#8220;3&#8221;<br />
&amp;&amp; m.Key4 == &#8220;4&#8221;<br />
&amp;&amp; m.Key5 == String.Format(&#8220;{0:00000}&#8221;, key))<br />
.FirstOrDefault();<br />
}</p>
<p>[List型(BinarySearch)]<br />
for (Int32 i = 0; i &lt; 1000; i++)<br />
{<br />
Random rm = new Random(i);<br />
Int32 key = rm.Next(100000);</p>
<p>Table tableKey = new Table();<br />
tableKey.Key1 = &#8220;1&#8221;;<br />
tableKey.Key2 = &#8220;2&#8221;;<br />
tableKey.Key3 = &#8220;3&#8221;;<br />
tableKey.Key4 = &#8220;4&#8221;;<br />
tableKey.Key5 = String.Format(&#8220;{0:00000}&#8221;, key);</p>
<p>Int32 index = lstTable.BinarySearch(tableKey, new TableCompare());<br />
Table table = lstTable[index];<br />
}</p>
<p>[SortedList型]<br />
for (Int32 i = 0; i &lt; 1000; i++)<br />
{<br />
Random rm = new Random(i);<br />
Int32 key = rm.Next(100000);</p>
<p>Table tableKey = new Table();<br />
tableKey.Key1 = &#8220;1&#8221;;<br />
tableKey.Key2 = &#8220;2&#8221;;<br />
tableKey.Key3 = &#8220;3&#8221;;<br />
tableKey.Key4 = &#8220;4&#8221;;<br />
tableKey.Key5 = String.Format(&#8220;{0:00000}&#8221;, key);</p>
<p>Table table = slstTable[tableKey];<br />
}</p>
]]></content:encoded>
			<wfw:commentRss>http://icoctech.icoc.co.jp/blog/?feed=rss2&#038;p=825</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
