dataTableに値が存在するかどうかを確認しますか?


91

AuthorBooknameの2つの列を持つDataTableがあります。

指定された文字列値AuthorがDataTableにすでに存在するかどうかを確認したいと思います。配列のように、それをチェックするための組み込みメソッドはあり array.containsますか?


8
LINQ?table.Any(t => t.Author == author);
ダビオ2012年

回答:


206

あなたは使用することができますLINQ-to-DataSetEnumerable.Any

String author = "John Grisham";
bool contains = tbl.AsEnumerable().Any(row => author == row.Field<String>("Author"));

別のアプローチは使用することDataTable.Selectです:

DataRow[] foundAuthors = tbl.Select("Author = '" + searchAuthor + "'");
if(foundAuthors.Length != 0)
{
    // do something...
}

Q:列ヘッダーがわからず、行の列にセル値PEPSIが存在するかどうかを確認したい場合はどうなりますか?すべてをループして見つけることができますが、もっと良い方法はありますか?–

はい、次のクエリを使用できます。

DataColumn[] columns = tbl.Columns.Cast<DataColumn>().ToArray();
bool anyFieldContainsPepsi = tbl.AsEnumerable()
    .Any(row => columns.Any(col => row[col].ToString() == "PEPSI"));

これらSystem.Data.DataSetExtensionsを参照およびusing System.Linq;クラスの使用に追加します
5377037 2017

2つの解決策のうち、どちらが速いでしょうか?
ポールアレクサンダー

1
@PaulAlexander:大きな違いはありません。ただし、DataTable.SelectLINQは完全な.NET Frameworkまたはカスタムメソッドを使用できるのに対し、古い構文は制限されています。したがって、.NET 2に固執している場合にのみ、を使用する必要がありますDataTable.Select。それ以外の場合は、常にLINQを使用します
Tim Schmelter 2018

パフォーマンスを重視し、データセットが大きいtbl.Select()場合は、他のアプローチよりも劇的に高速です。
HerrimanCoder

@ TimSchmelter-素晴らしいティム。しかし、ユーザーが列名を知らなくても、検索値に一致するすべての行を取得したい場合は、どうすればよいでしょうか。
チャンダンクマール

13

Linqを使用できます。何かのようなもの:

bool exists = dt.AsEnumerable().Where(c => c.Field<string>("Author").Equals("your lookup value")).Count() > 0;

8
DataRow rw = table.AsEnumerable().FirstOrDefault(tt => tt.Field<string>("Author") == "Name");
if (rw != null)
{
// row exists
}

using句に追加します:

using System.Linq;

そして追加:

System.Data.DataSetExtensions

参照へ。


5

DataTable.Select()メソッドを使用できるはずです。このようにできます。

if(myDataTable.Select("Author = '" + AuthorName.Replace("'","''") + '").Length > 0)
    ...

Select()関数は、whereステートメントに一致する結果のDataRowsの配列を返します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.