none
DataTableから値の取得 RRS feed

  • 質問

  • VS C#2013を使用して、ある値とDataTable内の列1の値を比較して、一番近い行の列2を取得するプログラムを作成しています.

    Datatable() table = new Datatable();

    table.Columns.Add("列1", typeof(String));
    table.Columns.Add("列2", typeof(String));

    float min1 = near.Min(c => Math.Abs(c - f));

    m_table.DefaultView.Sort = "列1, 列2"; // インデックス

    var rows = table.Select("列1= '" + near.First(c => Math.Abs(c - f) == min1).ToString() + "'"  , "列2");

    Console.WriteLine(rows[0].Field<String>("列2"));

    上記プログラムで近い値を検索することは出来ましたが、最終行で出力する際に、「インデックスが配列の境界外です.」と表示され、停止します.

    どのようにすれば、DataTableから値を取得できますでしょうか?

    2016年1月26日 1:29

回答

  • var rows = table.Select("列1= '" + near.First(c => Math.Abs(c - f) == min1).ToString() + "'"  , "列2");

    最終行とおっしゃっている処理の時に、上記の仕様を満たすデータが無いのだと思います。

    仕様をご確認下さい。

    • 回答としてマーク protecyamyam 2016年1月26日 2:23
    2016年1月26日 1:47
  • こんにちは。

    提示頂いたコードには, "table" と "m_table"が存在します。
    もしかして断片的なコードを提示用に加工したものでしたでしょうか。

    デバッグ実行し、Console.WriteLineする直前のrowsの件数を調べることは出来ますか。

    変数nearとtableの列1の件数、データ内容は一致していますか?
    2016年1月26日 1:48
    モデレータ
  • うーん? 「ある値とDataTable内の列1の値を比較して、一番近い行」という記述ではないように見えますが、大丈夫でしょうか?

    Selectを整理すれば、

    .Select("列1 = " + min1, "列2")

    にしかならないはずです。tableにmin1と完全一致する列1を持つ行は存在していますか?

    // 更に何故かDataViewが顔を出してるけど、Selectメソッドには全く影響しませんよ。

    • 回答としてマーク protecyamyam 2016年1月26日 2:23
    2016年1月26日 1:54

すべての返信

  • var rows = table.Select("列1= '" + near.First(c => Math.Abs(c - f) == min1).ToString() + "'"  , "列2");

    最終行とおっしゃっている処理の時に、上記の仕様を満たすデータが無いのだと思います。

    仕様をご確認下さい。

    • 回答としてマーク protecyamyam 2016年1月26日 2:23
    2016年1月26日 1:47
  • こんにちは。

    提示頂いたコードには, "table" と "m_table"が存在します。
    もしかして断片的なコードを提示用に加工したものでしたでしょうか。

    デバッグ実行し、Console.WriteLineする直前のrowsの件数を調べることは出来ますか。

    変数nearとtableの列1の件数、データ内容は一致していますか?
    2016年1月26日 1:48
    モデレータ
  • うーん? 「ある値とDataTable内の列1の値を比較して、一番近い行」という記述ではないように見えますが、大丈夫でしょうか?

    Selectを整理すれば、

    .Select("列1 = " + min1, "列2")

    にしかならないはずです。tableにmin1と完全一致する列1を持つ行は存在していますか?

    // 更に何故かDataViewが顔を出してるけど、Selectメソッドには全く影響しませんよ。

    • 回答としてマーク protecyamyam 2016年1月26日 2:23
    2016年1月26日 1:54
  • ご回答ありがとうございます.

    加工ミスでした.申し訳ありません.m_tableはtableと同じです.

    列1の件数は rows.length で取得して 1 が返ってきおりました.

    2016年1月26日 2:02
  • ご回答ありがとうございます.

    rows.length で 行数を確認すると 1 が返ってきましたので、データ自体はあると思います.

    2016年1月26日 2:04
  • ご回答ありがとうございます.

    .Selectの部分は

    http://mag.autumn.org/Content.modf?id=20120130114042

    上記サイト内容を参考に致しました.

    列1の件数は rows.length で取得して 1 が返ってきおりました.

    2016年1月26日 2:07
  • Console.WriteLine(rows[0].Field<String>("列2"));

    この行で、「インデックスが配列の境界外です.」が発生するという意味であってますよね?
    上記の時点でrows.length = 1 であるということですか?

    以下のような簡易的なデータでこちらでは発生しなかったので、tableデータ, f, near のデータ提示頂けると解決が早いかもしれません。

    static void Main(string[] args)
    {
    	var table = new DataTable();
    	table.Columns.Add("列1", typeof(string));
    	table.Columns.Add("列2", typeof(string));
    
    	table.Rows.Add("10", "r1");
    	table.Rows.Add("30", "r2");
    	table.Rows.Add("25", "r3");
    	table.Rows.Add("35", "r4");
    	table.Rows.Add("15", "r5");
    	table.Rows.Add("20", "r6");
    	table.Rows.Add("40", "r7");
    
    	var f = 41;
    	var near = new float[] { 10, 15, 20, 25, 30, 35, 40 };
    	
    	float min1 = near.Min(c => Math.Abs(c - f));
    
    	var rows = table.Select("列1= '" + near.First(c => Math.Abs(c - f) == min1).ToString() + "'", "列2");
    
    	Console.WriteLine(rows[0].Field<String>("列2"));
    
    	Console.Read();
    }
    

    2016年1月26日 2:20
    モデレータ
  • 皆様ご回答ありがとうございました.

    皆様のご指摘をもとに再度、rows.lengthで行数を確認したところ、最初の1回目の検索時のみ,rows.lengthが 0 だったためエラーが発生していました.

    処理はfor文を用いて、1万回程度繰り返しているため,気づかなかったようです.

    お騒がせ致しました.

    ありがとうございました.

    2016年1月26日 2:23