DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DataTable.Selectで文字列に対する条件指定の評価方法について

環境/言語:[.Net Framework1.1 C#.Net WindowsXP]
分類:[.NET]

DataTable.Selectで条件指定する際、対象の列が文字列であれば一重引用符でくくりますが、

DataTable dt = new DataTable();
dt.Columns.Add("Code");

のような簡単なDataTableでCodeに1〜25までの"文字"が格納されているときに

DataTable.Select("Code=1");

DataTable.Select("Code=25");

で抽出しようとすると、次のような結果になります。

●抽出された行
1,10,11,12,13,14,15,16,17,18,19,20

●抽出されなかった行
2,3,4,5,6,7,8,9,21,22,23,24,25

Code='1'のように引用符をつけた場合は、全て正しく抽出されました。
文字列に対しては引用符をつけるのが正しいとは思いますが、
列に格納されているのが数字のみのときに、引用符なしで指定した場合、
どのような評価をされてこのような結果になっているのでしょうか?
■No24774に返信(moscさんの記事)
> DataTable.Selectで条件指定する際、対象の列が文字列であれば一重引用符でくくりますが、
> DataTable dt = new DataTable();
> dt.Columns.Add("Code");
> のような簡単なDataTableでCodeに1〜25までの"文字"が格納されているときに

意図的に、"文字" という言葉を選んでおられるようですが、
それはつまり、string(文字列)ではなく、char(文字)であるという意味でしょうか。

for (int i = 1; i <= 25; ++i) {
 //string c = i.ToString();
 char c = (char)i;
 dt.Rows.Add(new object[] { c });
}


> DataTable.Select("Code=1");
> 〜
> DataTable.Select("Code=25");
> で抽出しようとすると、次のような結果になります。

これ、意外と複雑な問題かもしれません。

「string」の "1" 〜 "25" を格納したテーブルを走査したところ、
.NET 1.1 と .NET 2.0 とで、異なる結果となりました。詳細は後述。



> どのような評価をされてこのような結果になっているのでしょうか?

VS2008 だと、.NET の内部ソースまでデバッグ追跡できるので、
ある程度は調べられるかも知れませんが… .NET 1.1 の方は厳しいかも。


//////////// .NET 1.1 の結果 ////////////
1:1,
2:
3:
4:
5:
6:
7:
8:
9:
10:10,
11:11,
12:12,
13:13,
14:14,
15:15,
16:16,
17:17,
18:18,
19:19,
20:20,
21:
22:
23:
24:
25:


//////////// .NET 2.0 の結果 ////////////
1:1,
2:
3:
4:
5:
6:
7:
8:
9:
10:10,
11:11,
12:12,
13:13,
14:14,
15:15,
16:16,
17:Range オブジェクトの Min (8) は、 max (-1) 以下でなければなりません。
18:18,
19:Range オブジェクトの Min (10) は、 max (-1) 以下でなければなりません。
20:Range オブジェクトの Min (12) は、 max (-1) 以下でなければなりません。
21:
22:
23:
24:
25:


//////////// 検証コード ////////////

DataTable dt = new DataTable();
dt.Columns.Add("Code");

for (int i = 1; i <= 25; ++i)
{
    //char c = (char)i;
    string c = i.ToString();
    dt.Rows.Add(new object[] { c });
}

for (int i = 1; i <= 25; ++i)
{
    Console.Write(i + ":");
    try
    {
        DataRow[] rows = dt.Select("Code=" + i);
        foreach (DataRow row in rows)
        {
            Console.Write(row[0]);
            Console.Write(",");
        }
    }
    catch (Exception ex)
    {
        Console.Write(ex.Message);
    }
    Console.WriteLine();
}
> 意図的に、"文字" という言葉を選んでおられるようですが、
> それはつまり、string(文字列)ではなく、char(文字)であるという意味でしょうか。

まぎらわしい表現で申し訳ありません。
文字→文字列(string)です。


.NET 2.0での検証までしていただいてありがとうございます。
2.0ではまた違う結果となるのですね。

1.1ではこれ以上は厳しそうということなので、
ひとまず解決とさせていただきます。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板