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

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

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

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

Q&A

解決済

1回答

1586閲覧

[C#]下記について教えてください。

henoheno

総合スコア13

C#

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

0グッド

0クリップ

投稿2015/09/03 02:39

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

z|Cont=5

[0] |Count=3 //zにカーソルを合わせた結果
[1] |Count=3
[2] |Count=3
[3] |Count=3
[4] |Count=3

[0] |{[NO1,AAA]} //[0]にカーソルを合わせた結果 [1] |{[NO2,DDD]} [2] |{[NUM,500]}

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

ここからが本題なのですが、指定されたある値であるNO1とNO2であるNUMを抽出したいのですが、
これを瞬時に取り出す方法を教えていただけますでしょうか?

例えば、NO1がBBB、NO2がCCCとなるものをxに取り出したいときには

var Bval = BBB;
var Cval = CCC;
foreach(DICTIONARY y in z){
if((y["NO1"]==Bval) and (y["NO2"]==Cval))
{
x = y["NUM"];
break;
}
}

上記のようにしても取れないことはないのですが、行が多いほど時間がかかってしまいます。

x = z["Bval","Cval"]; //こんな記述はエラーですが。イメージです。

上記イメージのように指定すると瞬時に取り出せるようなやり方や書き方を教えていただけますよう
宜しくお願い致します。

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

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

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

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

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

Tak1wa

2015/09/03 02:49

C#コード上でのDB取得結果の型はなんですか?DataSetですか?
Tak1wa

2015/09/03 02:54

それとも、List<Dictionary<string, string>> でしょうか。
henoheno

2015/09/03 03:39

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

2015/09/03 04:07

では回答欄を参考にすれば出来そうです。子要素の型は異なりますが、元がListであればLINQで検索すれば良いです。
guest

回答1

0

ベストアンサー

こんにちは。

zをList<Dictionary<string, string>>と仮定して回答します。

C#

1static void Main(string[] args) 2{ 3 var list = new List<Dictionary<string, string>>(); 4 list.Add(GetHoge("AAA", "DDD", "500")); 5 list.Add(GetHoge("BBB", "CCC", "600")); 6 list.Add(GetHoge("CCC", "BBB", "700")); 7 list.Add(GetHoge("DDD", "AAA", "800")); 8 list.Add(GetHoge("EEE", "EEE", "900")); 9 10 var getItem = list.Where((item) => item["NO1"] == "BBB" && item["NO2"] == "CCC").FirstOrDefault(); 11 string x = string.Empty; 12 if (getItem != null) 13 { 14 x = getItem["NUM"]; 15 } 16 Console.WriteLine(x); 17 Console.Read(); 18} 19 20static Dictionary<string, string> GetHoge(string No1, string No2, string Num) 21{ 22 Dictionary<string, string> hoge = new Dictionary<string, string>(); 23 hoge.Add("NO1", No1); 24 hoge.Add("NO2", No2); 25 hoge.Add("NUM", Num); 26 return hoge; 27}

型が違えばやり方も若干違うかもしれません。
あとLINQ使えるのは.NET3.0か3.5あたりからだったと思うので2.0だと上記は使えません。

速度を測ったことはないですが、キーがあるならば型付データセットでユニーク設定してFindしたほうが速いかもしれません。

投稿2015/09/03 03:03

Tak1wa

総合スコア4791

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

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

henoheno

2015/09/03 06:23

簡単ではありますが、処理できたことを確認しました。 また、何か不明点ありましたら、教えていただければとおもいます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問