記事一覧

LinqでDictionary型から条件を指定してフィルターし、ToDictionaryで元の型に変換する方法 | VB.NET


VB.NETにてLinqを使用してデータの加工をすることがあると思いますが、LinqのWhereで条件を指定して抽出したデータ型がIEnumerable型になってしまいますので、元の型に戻す必要がありました。今回はDictionary型からWhereで絞ったデータをDictionary型に変換する方法についてご紹介いたします。


vb_todictionary_01.png


前提条件
Windows 7 professional 以降 / Windows Server 2008 R2 以降
Visual Studio 2008 professional 以降
vb.net
.Net FrameWork 3.5 以降 (System.Linqを参照設定)


1.変換手順

(1)変換元をDictinary型で定義する。
    Dictionary<キーとなる型, 値となる型>
    Dim customerDic As New Dictionary(Of Integer, CustomerInfo)
   
<参考URL>
https://msdn.microsoft.com/ja-jp/library/xfhwa508(v=vs.110).aspx
   
(2)System.Linq.Enumerable.Whereで顧客情報クラスの名前に「太郎」が含まれているという条件を指定してデータ抽出する
    customerDic.Where(Function(r) r.Value.Name.Contains("太郎"))

<参考URL>
https://msdn.microsoft.com/ja-jp/library/bb534803(v=vs.110).aspx

(3)System.Linq.Enumerable.ToDictionaryでDctionary型に変換する
    .ToDictionary(Function(r) r.Key, Function(r) r.Value)

<参考URL>
https://msdn.microsoft.com/ja-jp/library/system.linq.enumerable.todictionary(v=vs.110).aspx


2.サンプルコード

'Dictionary型に代入するデータクラス
Public Class CustomerInfo
    Public Property Id As Integer
    Public Property Name As String
    Public Sub New(ByVal id As Integer, ByVal name As String)
        Me.Id = id
        Me.Name = name
    End Sub
End Class

Public Class HowToUseDictionary
    Public Sub ConvertToDic()
        '変換したいDictinary型の定義
        Dim customerDic As New Dictionary(Of Integer, CustomerInfo)
        'サンプルデータを代入
        customerDic.Add(1, New CustomerInfo(1, "山田太郎"))
        customerDic.Add(2, New CustomerInfo(2, "山田花子"))
        customerDic.Add(3, New CustomerInfo(3, "平成太郎"))
        'Whereで条件を指定して絞り込む
        Dim customerEnum = customerDic.Where(Function(r) r.Value.Name.Contains("太郎"))
        '元のDictinary型に変換する
        customerDic = customerEnum.ToDictionary(Function(r) r.Key, Function(r) r.Value)
'出力
For Each kvp As KeyValuePair(Of Integer, CustomerInfo) In customerDic
Dim cInfo As CustomerInfo = DirectCast(kvp.Value, CustomerInfo)
Debug.WriteLine(cInfo.Id.ToString + ":" + cInfo.Name)
Next
    End Sub
End Class

出力結果
--------------------------------------
1:山田太郎
3:平成太郎


ToDictionaryの構文はDictionary型の構成によって多少変化しますが、このような使用方法が多いと思います。


関連記事

コメント

コメントの投稿
非公開コメント

アルバム

広告

プロフィール

石河 純


著者名 :石河 純
自己紹介:素人上がりのIT技術者。趣味は卓球・車・ボウリング

IT関連の知識はざっくりとこんな感じです。
【OS関連】
WindowsServer: 2012/2008R2/2003/2000/NT4
Windows: 10/8/7/XP/2000/me/NT4/98
Linux: CentOS RedHatLinux9
Mac: macOS Sierra 10.12 / OSX Lion 10.7.5 / OSX Snow Leopard 10.6.8
【言語・データベース】
VB.net ASP.NET C#.net Java VBA
Xamarin.Forms
Oracle10g SQLServer2008R2 SQLAnywhere8/11/16
ActiveReport CrystalReport ReportNet(IBM)
【ネットワーク関連】
CCNP シスコ技術者認定
Cisco Catalyst シリーズ
Yamaha RTXシリーズ
FireWall関連
【WEB関連】
SEO SEM CSS IIS6/7 apache2

休みの日は卓球をやっています。
現在、卓球用品通販ショップは休業中です。