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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

4回答

17227閲覧

Datatableの列数の数だけ列名をList<T>に格納したいです。

milkwalking

総合スコア60

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2019/05/07 00:59

編集2019/05/07 01:32

前提・実現したいこと

Datatableの列数の数だけ列名をList<T>に格納したいです。

文字列を格納するためのList<T>があります

C#

1List<string> Name = new List<string>();

そしてDatatableクラスの変数があります

C#

1DataTable dt = new DataTable();

このデータテーブルにはランダムで表が格納されるようになっており、
その列名を列名の数だけ自動的に取得したいです。

列名が1つでも9つでも15つでも自動的に格納してくれるようにしたいという感じです。
foreachを使用するのかと思い、やってみましたが、うまくやり方がわかりません、、、
列名の数だけ処理を繰り返すんですが、中身の処理にどうその文字列を使用するのかが不明です、、、

C#

1foreach (string name in dt.Columns) 2 { 3 4 Name.Add(dt.Columns[name].ColumnName); 5 6 }

お手数ですがご教示お願いいたします。

補足情報(FW/ツールのバージョンなど)

言語はC#
Windows Formを使用してアプリを作成中です
SQLサーバー
Microsoft SQL Server 2014 - 12.0.2269.0 (X64)
Express Edition (64-bit) on Windows NT 6.3 <X64> (Build 17763: )

VisualStudio2017という環境です。

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

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

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

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

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

k.matsuda

2019/05/07 01:22

変数 data ってどこから出たんでしょう? dt.Columns の情報が name に格納されるから、そっちから引っ張ればいいんでは?
milkwalking

2019/05/07 01:34

変数data打ち間違いでした。申し訳ありません。 dt.Columns[要素数].ColumnNameで引っ張れる認識なんですが、これを取得した列数の数だけ自動的にListにいれてもらいたいという操作、動きが希望なんですが、、、
guest

回答4

0

Microsoft の文書などを参考に、プロパティからどういうオブジェクトを取得できるのか調べて、それをベースによく考えてコードを書くことをお勧めします。適当にやっても絶対にうまくいきません。

まず、

foreach (string name in dt.Columns)

の dt.Columns で何が取得できるか調べてください。

DataColumnCollection すなわち DataTable の DataColumn オブジェクトのコレクションですよね。

なので、string name は間違いです。DataColumn column のようにすべきです。

foreach ループの中の、

Name.Add(dt.Columns[data].ColumnName);

の dt.Columns[data].ColumnName もダメです。column.ColumnName とすべきです。

ぐどいようですが、プロパティからどういうオブジェクトを取得できるのか一つ一つ調べてよく考えてください。適当にやっても絶対にうまくいきません。

投稿2019/05/07 02:04

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

milkwalking

2019/05/07 05:01

ご丁寧にありがとうございます。 の dt.Columns で何が取得できるか調べてください。 ←おっしゃるとおりです。まだはじめたてなので型や取得できたものをどう扱えばいいのかというイメージができないです。 プロパティからどういうオブジェクトを取得できるのか一つ一つ調べてよく考えてください。適当にやっても絶対にうまくいきません。 ←考え方のコツを教えていただきありがとうございます。おっしゃる考え方で調べれば自己解決能力も高められそうです!
guest

0

ベストアンサー

foreachを使うなら

c#

1foreach (DataColumn name in dt.Columns) 2 { 3 Name.Add(name.ColumnName); 4 }

で、いいと思いますけど。

nameの型を修正しました。

投稿2019/05/07 01:40

編集2019/05/08 00:42
k.matsuda

総合スコア293

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

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

YAmaGNZ

2019/05/07 01:50

Datatable.ColumnsはDataColumnCollection型でnameはDataColumn型になると思います。
k.matsuda

2019/05/07 01:54

はい。そこを修正するのを忘れてました。
milkwalking

2019/05/07 02:08

ありがとうございます。 foreach (DataColumn column in dt.Columns) { Name.Add(column.ColumnName); } でいけたました。 in dt.Columns  この部分は列名の数だけ そのcolumnをうけとって名前を呼び出してAdd ですね、、、ありがとうございます。
k.matsuda

2019/05/07 02:32

BAをいただいて恐縮です。 一応、「foreachを使うなら」という回答です。 hihijijiさんの記述だと1行で済みます。 他の方がおっしゃってるように、Microsoftのドキュメントを読んでいただき 色々とテストしていけば答えは見えてくると思います。 VSを使ってるなら、プロパティの候補と説明も出てくると思いますので理解が進むのは早いと思います。
guest

0

こちらを参照してください

投稿2019/05/07 01:14

編集2019/05/07 01:15
YAmaGNZ

総合スコア10242

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

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

milkwalking

2019/05/07 01:30

ご回答ありがとうございます。 http://www.woodensoldier.info/computer/csharptips/146.htm こちらのサイトでしょうか?難しいですね、、、 csv.Append("\""); csv.Append(column.ColumnName.Replace("\"", "\"\"")); csv.Append("\""); } try { writer = new StreamWriter(fileName, false, System.Text.Encoding.GetEncoding("shift-jis")); writer.Write(csv.ToString()); writer.Flush(); } finally { if(writer != null) { writer.Close(); } 上記の部分の動きがなかなか難しく理解が難しいです、、
YAmaGNZ

2019/05/07 01:38

このサンプルはDataTableをCSVとして保存するという感じのものになっています。 そのなかのforeachをどのように使っているかに注視してください。
guest

0

Linq を使って

C#

1List<string> columnNames = dt.Columns 2 .Cast<DataColumn>().Select(c => c.ColumnName).ToList();

とかどうでしょう?

投稿2019/05/07 01:11

hihijiji

総合スコア4150

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問