質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

Q&A

解決済

3回答

7466閲覧

SQLから取得したレコード順にDT型からHashtable型に格納したいです。

xss

総合スコア36

VB.NET

Microsoft Visual Basic .NETのことで、Microsoft Visual Basic(VB6)の後継。 .NET環境向けのプログラムを開発することができます。 現在のVB.NETでは、.NET Frameworkを利用して開発を行うことが可能です。

0グッド

1クリップ

投稿2018/01/18 07:32

編集2018/01/19 00:18

###前提・実現したいこと

DBからレコードを取得しDataTable型の変数に入れたのち、Key=カラム、Value=列の値で
Hashtableを作成したのですが、Hashtableにレコードの順(Select文の結果順)で値が
格納されず、順番がバラバラで格納され困っています。

これを防ぐ方法、または任意の順番で格納できますでしょうか?
ご教授をよろしくお願いします。

dtStorage
クイックウォッチで確認した取得結果
|name|age|sex|
|田中|21|男|

htStorage
理想の結果
0列目Key=|name| value=|田中|
1列目Key=|age| value=|21|
2列目Key=|sex| value=|男|

現在の結果
0列目Key=|age| Value=|21|
1列目Key=|sex| Value=|男|
2列目Key=|name| Value=|田中|

###該当のソースコード

'SQLの結果(レコードを格納する) 1レコード返ってきます。 DIm dtStorage as New DataTable dtStorage = (Select文を発行する関数) Dim htStorage As New Hashtable For x As Integer = 0 To dtStorage.Rows.Count - 1 '取得した行のカラム数分回す For y As Integer = 0 To dtStorage.Columns.Count - 1 'Key=Columns、Value=列の値 htStorage.Add(dtStorage.Columns.Item(y).ColumnName, dtStorage.Rows(x).ItemArray(y)) Next Next

###補足情報(言語/FW/ツール等のバージョンなど)
VisualStudio2017 VB.NET

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

Hashtableという語の意味を理解していらっしゃらないのだと思います。

Hashは「細切れにする」という意味の英語です。
Hashtableは、データをテーブルの端から順に格納するのではなく、ばらばらに格納する。格納する場所はkeyの値からHash関数によって決めるので、データを取り出す(検索する)のが早い(端から順に調べていくのに比べて、Hash関数を使って"この辺りにあるはず"というのが判るから)という特長があります。

テーブルの端から順にデータを入れるような用途にHashtableは不向きです。

投稿2018/01/18 07:58

coco_bauer

総合スコア6915

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xss

2018/01/18 08:09

coco_bauerさん回答ありがとうございます。意味を理解していませんでした。とても納得しました。ありがとうございます。
guest

0

ベストアンサー

調べてはいませんがHashtableは順番は保持されないような気がします。
同じようなのでDictionaryでは順番が保持されていました。
使い方は似たようなものなので、用途として問題なければ使ってみてください。
当方VB.NETの環境がなく、VBScriptで試しました。
.NET環境で動作が違っているようでしたらスルーしてください。

投稿2018/01/18 07:51

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xss

2018/01/18 08:15

ttyp03さん回答ありがとうございます。すみませんプログラム初心者な為Dictionaryと聞いてもピンと来ませんでした・・。よろしければコードを教えて頂けないでしょうか?宜しくお願い致します。
ttyp03

2018/01/18 08:22

VB.NET Dictionary」で検索すればいくらでもサンプルコードはあると思いますが、調べました? htStorageの定義を次のように書き換えます。 Dim htStorage As New Dictionary(Of Integer, String)() 追加等はHashtable同様Addでできると思います。 詳しくはマニュアルをどうぞ。 https://msdn.microsoft.com/ja-jp/library/xfhwa508(v=vs.110).aspx
xss

2018/01/18 08:27

何からお世話になり申し訳ありません、返信感謝します。
xss

2018/01/19 00:26

Dictionaryで行った結果、順番通りに格納してくれました。
ttyp03

2018/01/19 01:56

他の回答にあるように未定義な動作のようですので、良く検証してから採用してください。
guest

0

Dictionary は確か順番が保障されないのではなかったかな?と思います。
OrderedDictionary を使う方が良いのじゃないでしょうか。

追記:
OrderedDictionary ⇒ 追加した順番を保持してくれる(ただし非ジェネリック)
SortedDictionary ⇒ キーの順番で取り出せる
などがあります。

ただ、Dictionary についても「Removeなどをしなければ Add した順で取り出せる」という記述を見かけました・・・が、ソースを見つけられませんでした。どうなんでしょう

一応 以下は MS のページ
https://msdn.microsoft.com/ja-jp/library/xfhwa508.aspx

The order in which the items are returned is undefined.
アイテムが返される順序は未定義です。

投稿2018/01/18 08:57

編集2018/01/18 09:32
sk_3122

総合スコア1126

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xss

2018/01/19 00:38

sk_3122さん回答ありがとうございます。私自身Dictionaryを始めて扱い知識が乏しかった為、理解できました。高評価をさせて頂きます。ありがとうございます。Dictionaryで行いましたが、結果としては順番を保持してくれました。Removeなどをする予定が無いので大丈夫かなとは思いますが、OrderedDictionaryやSortedDictionaryを使ったほうが良いと思いますので試してみます。
sk_3122

2018/01/19 01:12

念の為 補足です。 > Removeなどをしなければ Add した順で取り出せる と書かれている個人のブログなどを見かけはしたのですが、その根拠となるドキュメントを見つけられなかったのでどうなんだろう?といった感じです。 上記が確実なことなのであれば問題がないのですが、 一般的に「アイテムが返される順序は未定義」とか「順番が保障されるものではない」と書かれている場合は、仮に 実際に試してみてAddした順番で返ってきたとしても それは「たまたま」そうなっただけで、そうでないこともあり得るよ、ということなので注意が必要です (´□`) お気をつけて...
xss

2018/01/19 05:08

sk_3122さん回答ありがとうございます。補足内容を拝見しました。今回はたまたま今回の結果になりましたが、データなど仕様が変更になった場合、違う結果になってしまう可能性もあるので気を付けなくてはならない事も学びました。色々なコードを扱ううえで気を付けてプログラミングをしていきます。コメントありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問