2010-01-05 4 views
4

저는 List<string>이며 DataTable을 가지고 있습니다.DataRow 컬렉션을 목록과 비교하십시오. <T>

DataRow의 열 중 하나가 ID입니다. List에는이 ID의 인스턴스가 보관됩니다.

DataTable은 타이머에 채워집니다.

목록에서 DataTable에없는 항목을 다른 목록으로 반환하고 싶습니다.

답변

12

당신은 당신이 IEnumerable을 수집하고 다음 그들 각각의에서 "ID"열 값을 선택하기 위해 데이터 테이블의 행을 캐스팅 수있는이

var tableIds = table.Rows.Cast<DataRow>().Select(row => row["ID"].ToString()); 

var listIds = new List<string> {"1", "2", "3"}; 

return listIds.Except(tableIds).ToList(); 

처럼 뭔가를 할 것입니다. 그런 다음 Enumerable.Except 확장 메서드를 사용하여 방금 만든 컬렉션에없는 List의 모든 값을 가져올 수 있습니다.

테이블에 있지만 목록이 아닌 값을 가져와야하는 경우 listIds 및 tableIds를 역순으로 변경하십시오. 테이블은 같은

+0

하나의 DataRow의 주조. – mehul9595

+0

+1. 캐스팅은 멋진 확장 방법에 대한 필자의 결핍 링크였습니다. – Alain

1

인 경우 :

DataTable dt = new DataTable(); 
dt.Columns.Add("ID"); 
DataRow dr = dt.NewRow(); 
dt.PrimaryKey = new DataColumn[] {dt.Columns[0]}; 
dr["ID"] = "1"; 
dt.Rows.Add(dr); 
dr = dt.NewRow(); 
dr["ID"] = "2"; 
dt.Rows.Add(dr); 
dr = dt.NewRow(); 
dr["ID"] = "3"; 
dt.Rows.Add(dr); 

및 목록은 다음과 같이이었다 :

List<string> ls = new List<string>{"1","2","4"}; 

우리는 항목이 목록에 아니라이 식으로 데이터 테이블에서 발견 얻을 수 :

var v = from r in ls 
       where !dt.Rows.Contains(r) 
       select r; 
     v.ToList(); 
1

HashSet<T>을 통해 합리적인 효율 (f astest 방법은 DataRow)가 DataColumn 인덱서 경유에서 데이터를 얻을 수 있습니다 :

 HashSet<int> ids = new HashSet<int>(); 
     DataColumn col = table.Columns["ID"]; 
     foreach (DataRow row in table.Rows) 
     { 
      ids.Add((int)row[col]); 
     } 
     var missing = list.Where(item => !ids.Contains(item.ID)).ToList(); 
+0

두 가지 접근법을 모두 테스트하지는 않았지만 귀하의 대답이 bdowden의 것보다 효율적이라고 말씀 하시겠습니까? – Jon

+0

엄청난 양이 아니라면 그다지 많지는 않을 것입니다. 문자열 인덱서는 모든 행에 대해 열의 조회를 수행합니다. 대부분의 경우 가장 간단하고 이해할 수있는 방법을 사용하십시오 (필요할 때만 최적화하십시오). –

+0

아, 캐스트/선택에 더 많은 열거 자 (= 더 많은 오버 헤드)가 있지만 다시는 그렇지 않습니다. –