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

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

ただいまの
回答率

90.40%

  • C#

    9462questions

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

  • LINQ

    137questions

    LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。

c#のLINQを使用して以下のことを実現したい。

解決済

回答 1

投稿

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

henoheno

score 7

DBから、SELECTした結果のものが変数Zに格納されております。
そして、この変数Zをブレークポイントを使用して中身をvisualstudioC#で
確認すると以下のような構造をしております。

z|Cont=9
---------------------
  [0]       |Count=3     //zにカーソルを合わせた結果
  [1]       |Count=3
  [2]       |Count=3
  [3]       |Count=3
  [4]       |Count=3
  [5]       |Count=3
  [6]       |Count=3
  [7]       |Count=3
  [8]       |Count=3
  ---------------------
    [0]       |{[NO1,AAA]}    //[0]にカーソルを合わせた結果
    [1]       |{[NO2,DDD]}
    [2]       |{[NUM,500]}

DB(Table)は下記のようなイメージです。

NO1,NO2,NUM
-----------
AAA,DDD,500
AAA,EEE,600
AAA,FFF,400
BBB,GGG,200
BBB,HHH,300
BBB,III,900
CCC,JJJ,700
CCC,KKK,500
CCC,LLL,900


DBから9行分のデータをSELECTしてます。列名(項目)はNO1,NO2,NUMの三つです。
NO1とNO2は、UNIQとなっております。(他の行との重複はない)

また、DBから取得した変数の型はXMLManagerです。XMLManager xmlのようにxmlという変数を定義します。 ただ、その後、z = new List<DICTIONARY>();とした変数zを生成し、 z = xml.dataRows;で代入しております。

ここからが本題なのですが、

① NO1がAAAとなるものをLINQを使用して瞬時に抽出する方法を教えてください。

② ①で取得したものをList<DICTIONARY>()型の変数に代入する方法を教えてください。


①について、上記テーブルで言いますと、

AAA,DDD,500
AAA,EEE,600
AAA,FFF,400

を指します。

近い方法として、NO1がAAA,NO2がEEEのときのNUM(600)を変数xに格納するときのやり方は下記の通りでうまくいきました。

var getItem = z.Where((item) => item["NO1"] == "AAA" && item["NO2"] == "EEE").FirstOrDefault();

string x = getItem["NUM"];

上記を応用すればいいと思うのですが、いまいち分かりません。 


②について、①で取得した

AAA,DDD,500
AAA,EEE,600
AAA,FFF,400

を下記のlistという変数に代入することを目的とします。

List<DICTIONARY> list = new List<DICTIONARY>();

その後、

foreach (DICTIONARY d in list){

    string no1 = d["NO1"];
    string no2 = d["NO2"];
    string num = d["NUM"];

}
のようにして1レコードづつforeachを使って処理をしたいです。


恐れ入りますが、ご回答の程、お願い致します。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • Tak1wa

    2015/10/01 15:52

    XMLManagerとは何ですか。オリジナルのクラスですか?

    キャンセル

  • henoheno

    2015/10/01 16:58

    オリジナルと思われます。

    キャンセル

回答 1

checkベストアンサー

+2

こんにちは。

こんなかんじです。
List<Dictionary<string, string>> z = GetHoge();
foreach (var d in z.Where((item) => item["NO1"] == "AAA"))
{
    string no1 = d["NO1"];
    string no2 = d["NO2"];
    string num = d["NUM"];
    Console.WriteLine(string.Format("no1:{0}, no2:{1}, num:{2}", no1, no2, num));
}
Console.ReadKey();

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2015/10/01 16:54

    Tak1waさん
    ご回答いただき有難う御座います。
    ですが、いただいた記述例は既に検証済みです。
    行いたいことはNo1のAAA,BBB,CCC毎(単位)のレコードをlist変数に代入してまずは保持することです。
    そのlist変数をあるメソッドに入力引数として渡したいのです。
    恐れ入りますが、ご教授お願いいたします。

    キャンセル

  • 2015/10/01 16:59

    Listに代入したいならば、List<Dictionary<string, string>> list = z.Where((item) => item["NO1"] == "AAA").ToList();としてください。

    キャンセル

  • 2015/10/01 18:10

    動作確認しました。
    希望通りのことが教えていただいた記述で達成できました。
    ありがとうございます。
    非常に助かりました。

    キャンセル

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

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

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

  • C#

    9462questions

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

  • LINQ

    137questions

    LINQとはLanguage INtegrated Queryの略で、「統合言語クエリ」という意味です。C#やVisual Basicといった言語のコード内に記述することができるクエリです。