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

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

ただいまの
回答率

90.43%

  • C#

    7980questions

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

C#のListの操作について

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 1,235

E3KUROSUKE

score 201

こんにちは。

まず目的なのですが、元になるCSVデータを2次元配列にして、二次元配列を1行づつ読み込み、C列にあたる要素によってそれ以外の列の中身を振り分けたいと思っています。

{"名前", "住所", "市町村区名"}
という配列が1万行以上あり、市町村区名が港区だとしたら、港区という要素がC列に有る行の住所・名前を各文字列にしてどんどん追加していきたいです。説明が難しいです。

{
{"田中", "AA県AA市AA街00", "A市"},
{"鈴木", "BB県BB市BB街00", "B市"},
{"麻生", "CC県CC市CC街00", "C市"},
{"大島", "AA県AA市AA街01", "A市"}
}


という風になっているものから、

{
{"田中、大島", "AA県AA市AA街00、AA県AA市AA街01", "A市"},
{"鈴木", "BB県BB市BB街00", "B市"},
{"麻生", "CC県CC市CC街00", "C市"}
}


という2次元配列を作りたいです。

わたしが思いついたのは

List<string[]> list = new List<string[]>();
foreach (string[] x in csvList)
{
    string[] tempList = { "", "", x[2] };
    list.Add(tempList);
}


(csvListはcsvファイルを2次元配列にしたものです)
この用に追加していき、後からListの重複を削除して、またcsvListを一行ずつ読み込んで、
Listの中の3列目が、csvListの3列目と一致する箇所の0番目と一番目に文字列を追加していけばいいかなというかんじです。

ですが、調べてみても見かけ上2次元配列になっている?Listの行列を指定してアクセスする方法が見つかりません。
そもそも後から指定した行列にアクセスして参照したり書き換えたりといったことはできないのでしょうか?

わかりづらい説明で申し訳ないのですが、このようなListの操作について教えていただきたく思います。
また、なにか他にもっといい方法等有りましたら教えていただきたいです。
よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+3

String[][] csvList;


という変数に元のデータが入っているものとして、

String[][] result = csvList
  .GroupBy(row => row[2])
  .Select(group => new String[]{
    String.Join("、", group.Select(member=>member[0]).ToArray()),
    String.Join("、", group.Select(member=>member[1]).ToArray()),
    group.Key
  })
  .ToArray();


こんな感じでresultに目的の配列が入ります。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/20 14:32

    具体的なコードありがとうございます。
    ですが、LINQについて知識がおいついていないので、もう少し調べてみます。

    キャンセル

+2

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/20 14:31

    LINQというやつですね、調べてみたのですが私にはよくわかりませんでした・・・
    もうちょいしらべてみます

    キャンセル

checkベストアンサー

0

調べてみても見かけ上2次元配列になっている?Listの行列を指定してアクセスする方法が見つかりません。

list[0]で、string[]ですので、
 string[] value = list[0]
 value[2]

 

list[0][2]


とすることで、「市区町村」部分にはアクセスできますよ。

今コード書く時間がないので、ヒントだけ、
LINQを使わないでList<>をつかうのであれば、
listに同じ「市区町村」があるかを探す。
あれば、氏名、住所を追記する。
なければ、listに追加する。
という流れになります。

「市区町村」をキーにして、Dictionaryを作成するのもいいかもしれません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/07/21 16:07

    こんなに簡単にアクセスできるんですね。勉強になりました。
    ヒントありがとうございます。かなり参考になりました。

    キャンセル

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

  • ただいまの回答率 90.43%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • C#

    7980questions

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