まず例外のクラス(IndexOutOfRangeException
)を調べます。
c# IndexOutOfRangeException - Google 検索
たいがいは公式のページが、上のほうに出てくるはずです。
IndexOutOfRangeException クラス (System) | Microsoft Docs
境界外のインデックスを使用して配列またはコレクションの要素にアクセスしようとしたときにスローされる例外。
今回のコードに当てはめて言うと、「配列y
のインデックス1
(2個目)にアクセスしたが、要素数は2個未満だった」ということです。
Harugomaruさんは必ずy
の要素数は2個(以上)と仮定されていますが、そうではないデータがあるということになります。
可能性としては、
:
のない行がある(入れてるつもりが全角だった)
- 空行がある(特に最後の行に注意)
くらいでしょうか?
特に改行で終わるテキストはやりがちです。File.ReadAllLines
で読むと、最後の空行は飛ばしてくれるので便利です。
File.ReadAllLines メソッド (System.IO) | Microsoft Docs
あとキーが重複した際もエラーになります。
想定外のデータが来た時にどうなるべきなのかは、Harugomaruさん次第です(単に読み飛ばせばいいのか、何かメッセージを出すのか...)
cs
1using System;
2using System.Collections.Generic;
3using System.IO;
4
5namespace Qcsotnf4fzdag1e
6{
7 class Program
8 {
9 static void Main()
10 {
11 File.WriteAllText("test.txt", "a:ほげ\r\nb:ふが\r\na:ぴよ\r\n");
12
13 var dict = new Dictionary<string, string>();
14
15 var lines = File.ReadAllLines("test.txt");
16 //Console.WriteLine(lines.Length); // 2
17
18 //var l = File.ReadAllText("test.txt").Split("\r\n");
19 //Console.WriteLine(l.Length); // 3
20
21 //var ll = File.ReadAllText("test.txt").Split("\r\n", StringSplitOptions.RemoveEmptyEntries);
22 // RemoveEmptyEntriesは途中の空行も飛ばしてくれる
23 //Console.WriteLine(ll.Length); // 2
24
25 foreach (var line in lines)
26 {
27 var split = line.Split(":");
28 //dict.Add(split[0], split[1]);
29
30
31 //if (2 <= split.Length) dict.Add(split[0], split[1]);
32
33 // キーが重複した場合、Addだとエラー
34 // System.ArgumentException: 'An item with the same key has already been added. Key: a'
35 // これならエラーは出ないが後勝ち(a:ほげが消える)
36 dict[split[0]] = split[1];
37 }
38 }
39 }
40}