• 締切済み

構造体を用いてKEYをチェックしたい。

VB2005、FlexGrid.NET環境です。 DataReaderを使い、KEYがかぶらなければ Gridに行を追加していく、という処理をやりたいと思っています。 たとえばKEYが1つであれば、 Dim keyCheck As New ArrayList While dr.Read 'レコードの数だけ処理を行う  If Not keyCheck.Contains(dr("KEY")) 'かぶっていない場合 fg.Rows.Add() '行を追加  keyCheck.Add(dr("KEY")) End While という処理で良いかと思うのですが、KEYが複数ある場合はどう したら良いか困っています。 たとえば、KEY1が1で、KEY2が2という値があった場合、上記の 方法ではKEY1しか判定できないですし、Arraylistをもう1つ 作ってAndで見るのでは、KEY1とKEY2を併せて判定できません。 おそらく、構造体というものを使うんだろうなとは思うのですが、 どうやって構造体に値を入れていけばいいのかわからず…。 出来ましたら、サンプルソースを交えて教えていただけると 助かります。 宜しくお願いします。

  • ginfix
  • お礼率34% (329/961)

みんなの回答

noname#221368
noname#221368
回答No.1

 以下のコードを試してみて下さい。 Public Class Form1 'Button1を持っているForm  '組合せKeyを表す構造体の型定義  Private Structure Combined_Key   'VBに組み込みのInterface.Combined_Key型に、比較演算を適用できるようにする   '厳密に型指定した方が良い   Implements IEquatable(Of Combined_Key)   Public Key1 As String   Public Key2 As String  Public Sub New(ByVal Key1 As String, ByVal Key2 As String)   '初期化を行うConstractor   Me.Key1 = Key1   Me.Key2 = Key2  End Sub  'IEquatableの実装.4行目の末尾でreturnすると、以下のFunctionのスケルトンが生成される  Public Function Equals1(ByVal other As Combined_Key) As Boolean Implements System.IEquatable(Of Combined_Key).Equals   'ここは手動で書く   If (Me.Key1 = other.Key1) And (Me.Key2 = other.Key2) Then 'Meとotherが等しい事の定義    Return True '等しい場合には、Trueを返す(必須)   Else    Return False 'そうでない場合は、Falseを返す(いまは省略可)   End If  End Function  End Structure Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click  Dim keyCheck As New List(Of Combined_Key) '厳密に型指定した方が早い(ArrayListと等価)  For i As Integer = 0 To 1   For j As Integer = 0 To 1    Dim SampleKey As New Combined_Key(CStr(i), CStr(j))    'Dim SampleKey As New Combined_Key    'SampleKey.Key1 = CStr(i).何かを代入しなければ、Key1はnothingのまま    'SampleKey.Key2 = CStr(j).何かを代入しなければ、Key2はnothingのまま    'と同じ    keyCheck.Add(SampleKey)   Next j  Next i  'keyCheck = {0,0),(0,1),(1,0),(1,1)}  Dim TestKey1 As New Combined_Key("0", "0") 'TestKey1 = (0,0)  Dim TestKey2 As New Combined_Key("0", "5") 'TestKey2 = (0,5)  If keyCheck.Contains(TestKey1) = False Then   MessageBox.Show("TestKey1 なし", "test", MessageBoxButtons.OK)  Else   MessageBox.Show("TestKey1 あり", "test", MessageBoxButtons.OK)  End If  If keyCheck.Contains(TestKey2) = False Then   MessageBox.Show("TestKey2 なし", "test", MessageBoxButtons.OK)  Else   MessageBox.Show("TestKey2 あり", "test", MessageBoxButtons.OK)  End If End Sub End Class

関連するQ&A

  • 構造体をコレクションに入れて扱いたいのですが…

    当方、Windows2000(SP2) + VB6.0(SP5) の環境です。 今、私が困っている事なのですが、宣言した構造体に入れた値を、 構造体ごとコレクションに追加して扱いたいと言う所なのです。 しかし最初の「構造体をコレクションに追加する」と言う時点で躓いています。 もしかして、構造体ごとコレクションに登録すると言う事は出来ないのでしょうか? 私が考えて書いたコードは以下のようになっております。 --- 標準モジュールにて構造体を宣言 --- Public gcolAddData As New Collection 'Collectionオブジェクト Public Type AddData '各データをレコードで獲得 varName As Variant varPostCd As Variant varAddress As Variant varTellNum As Variant End Type Public gAddData As AddData --- 以下が実際に走っているソースです --- '構造体に取得する With gAddData --- ここで構造体の各変数に値を入れています --- End With '構造体をコレクションに格納 gcolAddData.Add gAddData 普通にAddしてしまう方法なのですが、これでは駄目なのでしょうか。 方法があるのであれば教えて頂けると嬉しいです。 また、これは念の為の確認としてお聞きしたいのですが、 コレクションに追加した構造体を受け取りたい時は 以下のようにSet文で構わないですよね? Dim tmpAddData As gcolAddData Set tmpAddData = gcolAddData.Item(0) 何分、まだこの段階まで進めていない状態ですので……(汗 どうぞよろしくお願いします。

  • CSVファイルを読み込んで計算するには、構造体か?

    はじめまして。C++プログラミングの質問です。 初心者レベルの質問で申し訳ないのですが、お付き合いください。 CSVファイルを読み込んで、書かれている値を使ってある計算を行う、 ということをしたいのですが、処理方法をどうするか悩んでいます。 CSVファイルに書かれる最大行86400行、最大列6000列です。 また、開発環境はLinuxとなります。 私は「CSVファイルの項目を構造体に格納するクラス」と、「構造体の値を使って計算 するクラス」を考えました。 しかし、構造体ですと最大86400行のものを格納するのは、メモリを食うだけで無駄だという 指摘を受けました。 直接ファイルから値をとってきて、計算クラスに処理させるほうが無難と言われましたが、 「CSVファイルの項目を構造体に格納するクラス=データベース」と考えており、 後々拡張する場合に融通が利くのではないでしょうか。 経験が浅いので、断固たる主張ができないのですが・・・ 構造体に入れることばかり考えていたので、開発のボリュームを抑え、かつ、メモリを食わない 方法を全く思いつきません。 有識者の方へアドバイスを受けたいのですが、 ・大量のデータを読み込む場合、構造体等に格納する方が後ほど助かるか、 それとも、直接ファイル読み込みした方がよいか ・構造体格納のほかに相応しいやり方はないか この2点をメインにお答えいただけないでしょうか。 何か良いやりかたがありましたら教えていただきたいです。 よろしくお願い致します。

  • ComboBoxのItem追加

    VB.NETでの開発初心者です。 ComboBoxのItem追加について、1行づつ追加していくのは理解できているのですが、HTMLでのListBox「OPTIONS設定」の様にArrayListにて一括追加する方法がわかりません。 ご存知の方、よろしくお願いします。  <1行づつ追加>  Me.ComboBox1.Items.Clear()  Me.ComboBox1.Items.Add(New ComboItems(Key値, 表示値))    ※ComboItemsクラスは、別途作成 <一括追加>  Dim comboArray As New ArrayList  comboArray.Add(New ComboItems(Key値, 表示値))  Me.ComboBox1.Items.???(comboArray) ← ここがわからない  

  • jspでのArrayListの値の表示

    jsp上でBeanで以下のように設定されている ArrayList<ArrayList<Integer>> a; a.add(new ArrayList<Integer>); a.add(new ArrayList<Integer>); a.add(new ArrayList<Integer>); a.get(0).add(0); a.get(0).add(1); a.get(1).add(2); a.get(1).add(3); a.get(1).add(4); a.get(1).add(5); a.get(2).add(6); a.get(2).add(7); a.get(2).add(8); aのような行と列が不定のArrayListの全ての値をjspの画面上に  値 値 値  0  2  6  1  3  7    4  8    5 といったようにテーブルで表示したいのですがjspにどのような既述をすればよいでしょうか? クリックしたときの処理などの導入や項目を増やすなど拡張する場合があるので 以下のような形とレイアウトが同じようになると望ましいです <td> <table> <tr>値</tr> <tr>0</tr> <tr>1</tr> <tr>2</tr> </table> </td> <td> <table> <tr>値</tr> <tr>3</tr> <tr>4</tr> <tr>5</tr> </table> </td> <td> <table> <tr>値</tr> <tr>6</tr> <tr>7</tr> <tr>8</tr> </table> </td>

  • JAVAでの、clone() 参照渡し?について

    ArrayListで文字列の配列(String[ ])の配列を作りました。 そして、listにaddするときに *・・・ list.add(item)だと上手くいきません。      繰り返して異なる値のはずなのですが、      例えば、listget(0)[0] , list.get(1)[0] , list.get(2)[0]が全て同じ値になってしまいます。     しかし、     list.add(item.clone())だと上手くいきます、よくわかりませんが参照渡しというのでしょうか? 前者で何故上手くいかないのかがわからないのです。 この二つの違いは何なのでしょうか。 【プログラム】 ArrayList<String[]> list = new ArrayList<String[]>(); String[] item = new String[6]; //このwhileは数回繰り返されますが、下記の値は毎度異なります。 while(rs.next()) { item[0] = rs.getString("Field"); item[1] = rs.getString("Type"); item[2] = rs.getString("Null"); item[3] = rs.getString("Key"); item[4] = rs.getString("Default"); item[5] = rs.getString("Extra"); list.add(item); ・・・・・・・・・・・・・・・・・・・・*       }

    • ベストアンサー
    • Java
  • ArrayListにArrayListを用いた場合の対応について

    public static ArrayList<Integer> f1 = new ArrayList<Integer>(); public static ArrayList<ArrayList> f2 = new ArrayList<ArrayList>(); public void parse(Context ct){   if(ct.match("f")){ ct.nextToken(); while(ct.currentToken() != null && ct.currentToken().matches("[0-9]+/[0-9]*/[0-9]+")){ f1.add(ct.fToken(ct.currentToken())); ct.nextToken(); } f2.add(f1); f1.clear(); System.out.println(f2); 例f⇒f 1/4/3 2/5/6 4/5/6  1行⇒[1,2,4]  1/3/5 7/1/2 8/3/4  2行⇒[1,7,8]         ・         ・         ・   回答例⇒[[1,2,4],[1,7,8],[…],…,[…]] 上記のようなobj形式のf行をそれぞれ1行ごとに頭文字を取り出して(Contextで)、f1=ArrayList<Integer>にaddしていき、1行を読み終わったらf1=ArrayList<Integer>をf2=ArrayList<ArrayList>にaddしていき、最終的には回答例のような形にしたいです。 私はf1にaddした数字をf2にf1をaddして、その後f1をclearしてその空いたf1にまた次の行の数字をaddさせるつもりだったのですが、f1をクリアしてしまうと一度f2にaddしたはずのものも消えてしまうことに気づきました。 どのように改造すれば回答例のようにf2のArrayListにf1のArrayListをいくつもいれて表示することができますか。 教えてください。

  • 単結晶構造解析 フラック変数 解釈

    絶対構造確認するための指標 フラック変数の解釈に困っています。 ご存知の方よろしくお願いします! ものの本によると σ(x)<0.04 |x|<2σ(x) だと絶対構造が正しいそうです。 私が出した値、フラック変数が0.001(10)となる場合 1行目は、σ(x)=0.001±0.01 なので十分判定が強く 2行目は、|0.01|<2(0.001±0.01)と考えて判定は強くない、 絶対構造は間違ってる可能性があるという事でしょうか・・・ 個人的には1行目を満たしただけでも十分なのでは?と思っています。 そもそも私の解釈が間違っているのかもよく分かりません。 ご助言どうぞよろしくお願い致します。

  • Itaratorから値を取得するには?

    ArrayList<String> list = new ArrayList<String>(); list.add("その1"); list.add("その2"); list.add("その3"); list.add("その4"); Itarator itar = list.itarator(); while(itar.hasNext()){ System.out.println(itar.toString); itar.Next(); } 上記のように記述するとコンソールには その1 その2 その3 その4 というように出力されることを期待したのですが 結果はitar自身の値が返ってきてしまいました。 Itaratorを使用して、ArrayListの値を出力させるには どうすればよいのでしょうか?

    • ベストアンサー
    • Java
  • ArrayListへArrayListの格納

    お世話になっております。 ArrayListを2つ使用して2次元配列のような事をしようとしております。 データベースから取得したデータの1行をArrayListItemへ格納してそのArrayListItemをArrayListRecordへ格納しようとしております。 追加し終わり最後にArrayListRecordの中身を見ると全て一番最後のデータで置き換わっています。 どなたかご存知でしたらお教え願います。 ' 変数宣言 Dim objSqlDR As SqlDataReader Dim alSetItem As ArrayList Dim alSetRecord As ArrayList alSetItem = New ArrayList alSetRecord = New ArrayList ' データ取得分ループ While objSqlDR.Read()  alSetItem.Clear()  For intSetIndex = 0 To (objSqlDR.FieldCount - 1)   alSetItem.Add(objSqlDR(intSetIndex))  Next intSetIndex  alSetRecord.Add(alSetItem) End While

  • 構造体の構造体配列初期化

    typedef strunct _test01 { int a; int b; } test01_t; typedef strunct _test { int c; test01_t sTest01[256]; } test_t; test_t sTest; 上記のような構造体がある場合、sTestのメンバのsTest01をNULL初期化する 方法とsTest01に値が入っていないか(初期化されているか)を判定する方法を 教えていただけませんか? よろしくお願い致します。