3

すべてのデータテーブル列で文字列をすばやく見つける方法を見つけようとしています! すべての列の値を検索したいので、フォローは機能しません。

string str = "%whatever%";
foreach (DataRow row in dataTable.Rows)
    foreach (DataColumn col in row.ItemArray)
        if (row[col].ToString() == str) return true;
4

6 に答える 6

5

LINQ を使用できます。値が存在しない場合に備えて各セルを確認する必要があるため、それほど高速ではありませんが、1 行に収まります。

return dataTable
    .Rows
    .Cast<DataRow>()
    .Any(r => r.ItemArray.Any(c => c.ToString().Contains("whatever")));

ランダムなテキストを検索し、大文字と小文字を区別しない一致を持つセルを少なくとも 1 つ含む行の配列を返すには、次を使用します。

var text = "whatever";
return dataTable
    .Rows
    .Cast<DataRow>()
    .Where(r => r.ItemArray.Any(
        c => c.ToString().IndexOf(text, StringComparison.OrdinalIgnoreCase) > 0
    )).ToArray();
于 2012-05-19T00:39:34.370 に答える
2

Datatable のすべての列のすべての行をチェックしたい場合は、これを試してください (私にとってはうまくいきます!)。

DataTable YourTable = new DataTable();
// Fill your DataTable here with whatever you've got.

foreach (DataRow row in YourTable.Rows)
{
    foreach (object item in row.ItemArray)
    {
        //Do what ya gotta do with that information here!
    }
}

object item必要なもの (string、int など)に型キャストすることを忘れないでください。

デバッガーを試してみましたが、魅力的です。これがお役に立てば幸いです。幸運を祈ります。

于 2013-01-11T17:22:48.453 に答える
1

これは、フィルタリングによって実現できます。すべての列に基づいて (再利用可能な) フィルタリング文字列を作成します。

        bool UseContains = false;
        int colCount = MyDataTable.Columns.Count;


        string likeStatement = (UseContains) ? " Like '%{0}%'" : " Like '{0}%'"; 
        for (int i = 0; i < colCount; i++)
        {
            string colName = MyDataTable.Columns[i].ColumnName;
            query.Append(string.Concat("Convert(", colName, ", 'System.String')", likeStatement));


            if (i != colCount - 1)
                query.Append(" OR ");
        }

        filterString = query.ToString();

これで、列の 1 つが検索文字列と一致する行を取得できます。

 string currFilter = string.Format(filterString, searchText);
 DataRow[] tmpRows = MyDataTable.Select(currFilter, somethingToOrderBy);
于 2014-01-14T16:16:19.690 に答える
-1

データテーブルにフィルター式を作成することもできます。このMSDNの記事を参照してください。フィルタ式でlikeを使用します。

 string filterExp = "Status = 'Active'";
 string sortExp = "City";
 DataRow[] drarray;
 drarray = dataSet1.Customers.Select(filterExp, sortExp, DataViewRowState.CurrentRows);
 for (int i=0; i < drarray.Length; i++)
 {
    listBox1.Items.Add(drarray[i]["City"].ToString());
 }
于 2012-05-19T00:41:02.533 に答える