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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

1747閲覧

[c#]リスト化した配列を検索し表示させる方法

moconyan

総合スコア18

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

検索

検索は、あるデータの集まりの中から 目的のデータを見つけ出すことです。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/03/08 00:47

編集2019/03/08 02:03

csvファイルを読み込み、すべて配列化しリスト化しました。

リスト内の名前を検索し、同配列内の個別の情報が各テキストボックス内に表示されるようにしたいです。

まず試したことはインデックスを取得し表示させようと思ったのですが、取得できずエラーが出てしまいます。

取得した後に配列を指定する[]内に入れることができないかもしれませんが....

何かいい方法がないかと数日悩んでおりますが解決策が見つからないので質問させていただきました。
よろしくお願いいたします。

c#

1public partial class Form1 : Form 2 { 3 public static List<string[]> csvData = new List<string[]>(); 4 5 public Form1() 6 { 7 InitializeComponent(); 8 } 9 10 private void Form1_Load(object sender, EventArgs e) 11 { 12 // csv読込み 13 LoadCsv(); 14 } 15 16 public void LoadCsv() 17 { 18 try 19 { 20 // csvファイルを開く 21 using (var sr = new System.IO.StreamReader(@"test.csv")) 22 { 23 //ヘッダを読み捨てる。 24 sr.ReadLine(); 25 // ストリームの末尾まで繰り返す 26 while (!sr.EndOfStream) 27 { 28 // CSVファイルの一行を読み込む 29 string line = sr.ReadLine(); 30 // 読み込んだ一行をカンマ毎に分けて配列に格納する 31 string[] record = line.Split(','); 32 // リストに追加 33 csvData.Add(record); 34 } 35 } 36 } 37 catch (System.Exception e) 38 { 39 // ファイルを開くのに失敗したとき 40 MessageBox.Show("ファイルの読み込みに失敗しました。", "エラー", MessageBoxButtons.OK, 41 MessageBoxIcon.Error); 42 } 43 } 44 45 // 表示ボタン 46 private void buttonView_Click(object sender, EventArgs e) 47 { 48 string InputID = textBoxName.Text; 49 int num = csvData.IndexOf(InputID);   //エラー //ここで取得した値は下の[]内にいれることはできるのだろうか...? 50 51 textBoxName.Text = csvData[0][0]; 52 textBoxAge.Text = csvData[0][1]; 53 textBoxGender.Text = csvData[0][2]; 54 textBoxAddress.Text = csvData[0][3]; 55 textBoxTelText = csvData[0][4]; 56 }

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

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

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

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

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

Zuishin

2019/03/08 00:52

List でなければいけませんか? List でもできなくはありませんが、DataTable の方がきれいに書けます。
Zuishin

2019/03/08 00:55

また、CSV の形式が定まっている場合は、匿名型や Json を使うと楽です。
KoichiSugiyama

2019/03/08 01:00

やりたいことが今一つ伝わってこないのですが、テキストボックスからどんなデータを取得して何のインデックスとしようとしているのでしょうか?具体的なデータで説明してもらったほうが意図が伝わりやすいと思います。
moconyan

2019/03/08 01:05

Zuishin様 特にリストでないければいけないということはありませんが、情報の上書きもできるようにする予定です。 Data Table一度調べさせていただきますありがとうございます。
moconyan

2019/03/08 01:09

KoichiSugiyama様 テキストボックスに名前を入力し、それに紐づいた住所や電話番号を各テキストボックスに表示させたいということです。 わかりずらくてすみません...。
ebiryo

2019/03/08 01:41

同じ名前が複数ある可能性は考慮しなくて良いのですか?
moconyan

2019/03/08 01:49

ebiryo様 はい、同じ名前の場合は考慮しなくて大丈夫です!
guest

回答1

0

ベストアンサー

InputIDは名前とのこと。
var theRow = csvData.FirstOrDefault(x => x[0] == InputID);で1列目がInputIDに等しいものがあれば一つ、なければnullが取れるので、textBoxName.Text = theRow[0];などとするのが簡便ではないかと思います。

投稿2019/03/08 01:11

編集2019/03/08 01:45
papinianus

総合スコア12705

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

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

moconyan

2019/03/08 01:34

papinianus様 ご回答ありがとうございます。 こちらのコードを試させていただいたところ、エラーが出てしまいます。 ``` // 表示ボタン private void buttonView_Click(object sender, EventArgs e) { string InputID = textBoxName.Text; var theRow = csvData.FirstOrDefault(x[0] == InputID);  //エラー textBoxName.Text = theRow[0]; } ``` "在のコンテキストに'x'という名前は存在しません。" エラーについて調べてみたのですが何か抜けているのでしょうか...? 初歩的な質問かもしれませんがご教示お願いいたします。
moredeep

2019/03/08 01:37

csvData.FirstOrDefault(x => x[0] == InputID); ですかね?
papinianus

2019/03/08 01:46

moredeep様のおっしゃるとおり、x=>が足りてませんでした。 回答を修正しております。
moconyan

2019/03/08 01:47

こちらのコードに修正後、無事表示することができました!! ご回答くださったコードも理解したのち進めていきたいと思います。 ご回答くださった皆さん、本当にありがとうございます。 ```c# // 表示ボタン private void buttonView_Click(object sender, EventArgs e) { string InputID = textBoxName.Text; var theRow = csvData.FirstOrDefault(x => x[0] == InputID); textBoxName.Text = theRow[0]; textBox.Age = theRow[1]; textBoxGender.Text = theRow[2]; textBoxAddress.Text = theRow[3]; textBoxTel.Text = theRow[4]; } ```
papinianus

2019/03/08 01:49

最低限nullチェックはしたほうがいいですよ。 FirstOrDefaultだと名前がマッチしなかったとき、theRowはnullになり、theRow[0]で例外となります。
moconyan

2019/03/08 01:55

papinianus様 ご指摘ありがとうございます。 そうですね、今のままですとnullの場合と存在しない名前の場合処理が止まってしまうので例外処理を足し行きたいと思います。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問