dataTable에 값이 있는지 확인 하시겠습니까?


92

AuthorBookname 두 열이있는 DataTable이 있습니다.

주어진 문자열 값 Author가 이미 DataTable 에 있는지 확인하고 싶습니다 . 배열과 같이 그것을 확인하는 내장 방법이 array.contains있습니까?


8
LINQ? table.Any(t => t.Author == author);
Davio

답변:


206

다음 LINQ-to-DataSet과 함께 사용할 수 있습니다 Enumerable.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 : Headers 열을 모르고 PEPSIrows'c 열에 셀 값 이 있는지 확인하려면 어떻게해야합니까? 모든 것을 반복하여 알아낼 수 있지만 더 좋은 방법이 있습니까? –

예, 다음 쿼리를 사용할 수 있습니다.

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

두 가지 솔루션 중 어느 것이 더 빠를까요?
Paul Alexander

1
@PaulAlexander : 큰 차이는 없습니다. 그러나 이전 DataTable.Select구문은 제한적이지만 LINQ는 전체 .NET 프레임 워크 또는 사용자 지정 메서드를 사용할 수 있습니다. 당신이 .NET 사용한다 2에 붙어 그래서 경우에만 DataTable.Select, 그렇지 않으면 난 항상 LINQ 선호하는 것
팀 Schmelter

성능에 관심이 있고 대규모 데이터 세트 tbl.Select()가있는 경우는 다른 접근 방식보다 훨씬 빠릅니다.
HerrimanCoder

@TimSchmelter-위대한 팀. 그러나 사용자가 열 이름을 모르지만 검색 값과 일치하는 모든 행을 얻으려면 어떻게 할 수 있습니까?
Chandan Kumar

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.