投稿者 魔界の仮面弁士  (社会人) 投稿日時 2015/12/25 10:37:33
> FirstOrDefaultやContainsKey等とはどのように異なるのでしょうか。
既にご存知かもしれませんが、FirstOrDefault を用いた
Dim matchedValue As String = If(ct.dic.FirstOrDefault(Function(k) k.Key = text).Value, "")
というコードは、要するに、
Dim matchedValue As String = ""    'Default Value 
For Each k In dic
    If k.Key = text Then
        matchedValue = k.Value
    End If
Next
の処理にあたります。

検索対象のデータが、もしも最後の一件に登録されていた場合、
探索のために全件ループが発生することになります。
そのため、データ量が多くなるにつれて、探索時間が伸びます。

一方、ContainsKey や TryGetValue の場合は、ハッシュという仕組みを
使って探索するようになっているため、キーを素早くみつけることができます。


そして、その ContainsKey や TryGetValue は、以下のように使います。
下記の 2 つのコードは、いずれも同じ意味です。

'ContainsKey を使った場合 
Dim matchedValue As String
If dic.ContainsKey(text) Then   'キーの存在チェック 
    matchedValue = dic(text)    '見つかったのでインデクサで取り出す 
    Debug.Print("発見!")
Else
    matchedValue = Nothing
    Debug.Print("見つからない")
End If


'TryGetValue を使った場合 
Dim matchedValue As String = Nothing
If dic.TryGetValue(text, matchedValue) Then  '存在チェック&値取得 
    Debug.Print("発見!")
Else
    Debug.Print("見つからない")
End If



> 今回はクラスでの処理を検討しておりますが
「外部リソースを読み取って管理するクラス」を作れば良いとおもいます。
My.Settings や My.Resources も、そうしたクラスですよね。

固定的データなら、内部リソースにするのも手ですが、
その変換表を今後もメンテナンスする予定があるのなら、
管理上は外部ファイルやデータベースの方が楽だと思います。


> リソースファイルでのサンプル
ちなみに app.config の各セクションは、別ファイルにすることも出来ます。

各ファイルは、EXE と同じ場所に配置しておく必要がありますが、
ソリューション エクスプローラーを右クリックし、各ファイルのプロパティで
「出力ディレクトリにコピー」を変更しておけば OK。
(ただし、App.config 本体だけはコピーしない設定にしておく)


=== App.config ===
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup" >
      <section name="ConsoleApplication1.My.MySettings" type="System.Configuration.ClientSettingsSection" />
      <section name="WindowsApplication1.My.MySettings" type="System.Configuration.ClientSettingsSection" />
    </sectionGroup>
    <sectionGroup name="変換辞書">
      <section name="長さ単位" type="System.Configuration.DictionarySectionHandler" />
      <section name="面積単位" type="System.Configuration.DictionarySectionHandler" />
    </sectionGroup>
  </configSections>
  <applicationSettings>
    <WindowsApplication1.My.MySettings configSource="App.WindowsApplication1.config" />
    <ConsoleApplication1.My.MySettings configSource="App.ConsoleApplication1.config" />
  </applicationSettings>
  <変換辞書>
    <長さ単位 configSource="App.長さ単位.config" />
    <面積単位 configSource="App.面積単位.config" />
  </変換辞書>
</configuration>



=== App.長さ単位.config ===
<?xml version="1.0" encoding="utf-8" ?>
<長さ単位>
  <add key="ミリメートル" value="㎜" />
  <add key="センチメートル" value="㎝" />
</長さ単位>



=== App.面積単位.config ===
<?xml version="1.0" encoding="utf-8" ?>
<面積単位>
  <add key="平方ミリメートル" value="㎟" />
  <add key="平方センチメートル" value="㎠" />
</面積単位>



=== App.WindowsApplication1.config ===
<?xml version="1.0" encoding="utf-8" ?>
<WindowsApplication1.My.MySettings>
  <setting name="Poster" serializeAs="String">
    <value>YUU</value>
  </setting>
  <setting name="ThreadId" serializeAs="String">
    <value>25977</value>
  </setting>
  <setting name="Title" serializeAs="String">
    <value>変換表について。</value>
  </setting>
</WindowsApplication1.My.MySettings>



=== App.ConsoleApplication1.config ===
<?xml version="1.0" encoding="utf-8" ?>
<ConsoleApplication1.My.MySettings>
  <setting name="Poster" serializeAs="String">
    <value>魔界の仮面弁士</value>
  </setting>
  <setting name="CommentId" serializeAs="String">
    <value>69614</value>
  </setting>
</ConsoleApplication1.My.MySettings>