🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

1回答

1184閲覧

【C#】二次元リストの単一要素取得をループさせたい。

MARINE_SeaDevil

総合スコア4

C#

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

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2021/02/25 08:50

編集2021/02/25 13:42

自動登録システムが作りたくて始めました。初心者です。
列数が65で決まっていて行数が決まっていないcsvを読み込もうと思い、二次元リストで取り込みました。
1行ずつその後の処理をループさせたいんですがどうすればいいでしょうか。

for文を使いLINQを使えば行けるんじゃないかと思いますが・・・

C#

1var query = from i in list 2 where ([i],[0]) //このようなLINQ? 3 select i; 4 5for(var i = 0; i < 64; i++) //このようなループ文? 6 { 7 }

ウェブ上の入力箇所にcsvから取り込んだものをSeleniumによって制御しようとしています。

C#

1driver.FindElement(By.id("title")).SendKeys(list[i][0]); //タイトル 2driver.FindElement(By.id("category")).SendKeys(list[i][1]); //カテゴリ 3. 4. 5. 6driver.FindElement(By.id("delete_code")).SendKeys(list[i][64]); //削除コード 7driver.FindElement(By.XPath("listing")).Click(); //登録ボタンをクリック 8 9return i++ 10//ここでiの値を1つ増加させる

何を記述したらいいのかわからないので、ご質問で要望をお願い致します。

バージョンは
Microsoft Visual Studio Community 2019
Version 16.8.6
VisualStudio.16.Release/16.8.6+31019.35
Microsoft .NET Framework
Version 4.8.04084
です。

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

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

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

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

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

soi013

2021/02/25 12:40 編集

C#には"二次元リスト"は存在しません。二次元配列 `T[,]` またはリストのリスト `List<List<T>>` ではないでしょうか。
MARINE_SeaDevil

2021/02/25 12:50

リストのリストList<List<string>>ですね。 他サイトで見た際、二次元リスト書いてありましたので、そう書いてしまいました。 申し訳ございません。
soi013

2021/02/25 13:24

“処理”の中身によって、全てLINQでやるか、foreach文でやるべきかは変わってきます。 どのような内容でしょうか?数行程度の説明があった方が良いです
Zuishin

2021/02/25 13:54 編集

LINQ は通常 foreach とともに使います。 それはともかく CSV であれば CsvHelper を使用してクラスにマッピングすると可読性が高くなり扱いやすくなります。 https://blog.okazuki.jp/entry/2014/12/26/121954 質問のコードではマジックナンバーを使っているようですが、マジックナンバーは極力コードから排除しましょう。
guest

回答1

0

ただ単に列挙するだけなら、for文ではなく、foreach文を使用します。
今回は無いですが、 list の絞り込みや変換をする場合はLINQをforeachの手前で使用します。

csharp

1foreach (var row in list) 2{ 3 driver.FindElement(By.id("title")).SendKeys(row[0]); //タイトル 4 driver.FindElement(By.id("category")).SendKeys(row[1]); //カテゴリ 5 . 6 . 7 . 8 driver.FindElement(By.id("delete_code")).SendKeys(row[64]); //削除コード 9 driver.FindElement(By.XPath("listing")).Click(); //登録ボタンをクリック 10}

ただし、質問の本題(どうやってList<List<T>>を列挙するか?)とは少しずれますが、
@Zuishinさんがコメントに書いているように、row[1]というように直接数字を指定したインデックスアクセスはマジックナンバーと言われ、避けるべき方法です。
できれば、クラスを定義して、List<List<T>>から変換するか、そもそもCSV読み込み時にそのクラスで読み込むようにしたほうが良いです。

投稿2021/02/25 23:20

編集2021/02/26 11:17
soi013

総合スコア149

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

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

Zuishin

2021/02/25 23:23

マジックナンバーについて言及があるのにあえてそれを使う必要は?
soi013

2021/02/26 11:09

マジックナンバーについて言及?と思ったら、私のあとにコメントされていたんですね。見逃していました。 たしかにマジックナンバーは使わないほうがよいですね。 追記しておきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問