C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Dictionaryについて

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■88053 / inTopicNo.1)  Dictionaryについて
  
□投稿者/ hh (1回)-(2018/07/31(Tue) 11:01:02)

分類:[.NET 全般] 

2018/07/31(Tue) 11:02:34 編集(投稿者)
2018/07/31(Tue) 11:02:30 編集(投稿者)

<pre><pre>初めまして
現在作成している事で、困り事がありご質問です

開発環境 VB.net2013

No,名称,Lv,始時間,終時間
1,test0,1,9:20,9:30
1,test0,2,13:45,13:55
2,test1,1,6:30,6:40
2,test1,2,19:30,19:40
3,test2,1,9:40,9:50
4,test3,1,6:35,6:45
5,test4,1,6:30,6:40

このようなテキストファイルを
配列に入れ込みます

Private Load_File As String() = File.ReadAllLines(Appdir & "\config.csv", enco) '設定ファイル


始時間が早い時間ごとに並び替えようするため
まず

Datetime型を宣言し

Dim timetable As DateTime()
timetable = New DateTime(Load_File.Length - 1) {}

始時間部分だけを新しい配列に入れ込み

For i As Integer = 1 To Load_File.Length - 1
timetable(j) = Load_File(j).Split(","c)(3)
Next

ソートで時間を並べ替える

Array.Sort(timetable)

Dictionaryを宣言

Dim listsort As New Dictionary(Of timetabel, String)

Dictionary key,valueの設定
For i As Integer = 0 To Load_File.Length - 1
listsort(timetable(i)) = Loaffile(j)
Next

これは表示用のLabelです
disp = New Label(5) {}
Dim line As String = "/"

For i As Integer = 0 To 5

Dim tmp As String = listsort(timetable(i))

T_name = {tmp.Split(","c)(1), tmp.Split(","c)(2), tmp.Split(","c)(3), tmp.Split(","c)(4)}

disp(i) = DirectCast(Me.Controls("disp" & i.ToString), Label)
disp(i).Text = T_name(0) & line & T_name(1) & line & T_name(2) & line & T_name(3)
Next

とし
test1/1/6:30/6:40
test4/1/6:30/6:40
test3/1/6:35/6:45
test0/1/9:20/9:30
test2/1/9:40/9:50
test0/2/13:45/13:55
test1/2/19:30/19:40


時間が早い順に表示させるつもりが

実際は
test1/1/6:30/6:40
test1/1/6:30/6:40
test3/1/6:35/6:45
test0/1/9:20/9:30
test2/1/9:40/9:50
test0/2/13:45/13:55
test1/2/19:30/19:40
と表示されます


test4/1/6:30/6:40
がデバックすると消えています

test1/1/6:30/6:40
test4/1/6:30/6:40
同じ時間があると消えるものなのでしょうか??

timetableの型の中は 正常になっていますが
Dictionary key,valueの設定をすると

カウントも6のはずが5しかありません

私の処理の仕方がおかしいのかもしれませんので
ご指摘、ご指導をよろしくお願い致します。




</pre></pre>
引用返信 編集キー/
■88061 / inTopicNo.2)  Re[1]: Dictionaryについて
□投稿者/ furu (177回)-(2018/07/31(Tue) 12:47:24)
No88053 (hh さん) に返信
> 同じ時間があると消えるものなのでしょうか??

辞書(Dictionary)の単語(key)はユニークなので
ひとつしか登録できません。

> listsort(timetable(i)) = Loaffile(j)

同じ時間がすでにあれば、上書き
なければ、要素が追加されます。

すべて追加したい場合、Addメソッドを使うべきです。
同じキーがある場合、ArgumentException例外になるので
プログラムの間違いが早くわかります。
引用返信 編集キー/
■88062 / inTopicNo.3)  Re[1]: Dictionaryについて
□投稿者/ はまぐり (12回)-(2018/07/31(Tue) 13:37:29)
Dictionaryのデータ構造は連想配列で
連想配列はキーの重複を認めないのですよね
キーの重複を認めるデータ構造はマルチマップとか多重連想配列と呼ばれます。

.NETの標準ライブラリにはマルチマップを実装するクラスは存在しないので
自作するのがいんじゃないでしょうか

↓でっち上げるならこんなふうに

Dim listsort As New Dictionary(Of DateTime, List(Of String))

For i As Integer = 0 To Load_File.Length - 1
	AddList(listsort, timetable(i), Loaffile(j))
Next

Sub AddList(Dict As Dictionary(Of DateTime, List(Of String)), Key As DateTime, Value As String)
	Dim ValueList As List(Of String)
	If Not Dict.TryGetValue(Key, ValueList) Then
		ValueList = new List(Of String)()
	End If
	ValueList.Add(Value)
	Dict(Key) = ValueList
End Sub

ちゃんと実装するならジェネリック使ってクラスを定義したが良いでしょうけど、まあ、お好みで

引用返信 編集キー/
■88063 / inTopicNo.4)  Re[2]: Dictionaryについて
□投稿者/ hh (2回)-(2018/07/31(Tue) 14:03:13)
No88062 (はまぐり さん) に返信

皆さんありがとうございます
データ構造を理解できずに使っていたため
上手くいかなかったわけですね・・・

まだまだ勉強不足です

ちなみに
ソートして並び替え表示させるために
Dictionaryを選択しましたが

この場合
どのような方法がベターなんでしょうか?
熟練のプログラム作りの方々の
考えを知りたいので

もしよろしければ教えてください
引用返信 編集キー/
■88064 / inTopicNo.5)  Re[3]: Dictionaryについて
□投稿者/ とっちゃん (505回)-(2018/07/31(Tue) 14:11:12)
No88063 (hh さん) に返信
> ちなみに
> ソートして並び替え表示させるために

ソート結果順に並べばいいのなら、List にするかな?
重複も考慮せずに使えますし、何より好きな型を難しいことを考慮せずに格納しておけます。

保持するデータをいい感じに作ったクラスオブジェクトにしておけば、ソートも OrderBy などのLINQを活用して、かなり簡素に書けるようになります。
最初のファイルロードの時点で、Select使って無名クラスにするというやり方もあります。


まぁ、データ構造や量によっては、独自クラス+Listなどではなく、DB(SQLiteでも十分)などを導入することも考えますけど。

引用返信 編集キー/
■88065 / inTopicNo.6)  Re[4]: Dictionaryについて
□投稿者/ はまぐり (13回)-(2018/07/31(Tue) 14:35:25)
No88064 (とっちゃん さん) に返信

そっかーそれですね、レコードのオブジェクト作ってしまうのが良いですね
私もそれに賛成です
引用返信 編集キー/
■88068 / inTopicNo.7)  Re[5]: Dictionaryについて
□投稿者/ hh (3回)-(2018/07/31(Tue) 15:04:50)
No88065 (はまぐり さん) に返信
> ■No88064 (とっちゃん さん) に返信
>
OrderBy などのLINQを活用をMSDNで見て
こんなのもあるとは・・
恐れ入りました

やはり経験、知識まだまだ足りないのを痛感しました
もっと書けるように
頑張ります

皆様ありがとうございました
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ