2014-11-25 2 views
0

나는 DataTable이며 모든 빈 열을 지울 필요가 있습니다. 여기 코드 예가 ​​있습니다 :행 번호를 얻는 방법?

for (var i = 0; i < table.Columns.Count; i++) 
{ 
     if (table.Rows.Cast<DataRow>().All(r => string.IsNullOrWhiteSpace(r[i].ToStringOrNull()))) 
     { 
      table.Columns.RemoveAt(i--); 
     } 
} 

질문 : 행 번호는 어떻게 얻을 수 있습니까 If-statement?

감사합니다.

+0

행 번호를 데이터 테이블에 기반으로 찾고 계십니까? –

+0

확장 메소드'All' 대신'for'를 사용하십시오. – Vlad

답변

0

"행 번호"가 개체의 인덱스 인 경우 개체에서 Rows 개체의 색인을 직접 가져올 수 없습니다. 블라드의 의견에 제안 당신은이 대신 같은 것을 사용할 수 있습니다 말했다

for (var i = 0; i < table.Columns.Count; i++) 
{ 
    if (Enumerable.Range(0, table.Rows.Count).All(
     j => string.IsNullOrWhiteSpace(tables.Rows[j][i].ToStringOrNull()))) 
    { 
     table.Columns.RemoveAt(i--); 
    } 
} 

, 당신이 한 번만 각 행을 방문하는 데이터는 처리하기 위해 더 나은 것이라고 나에게 보인다. 최소한 데이터 지역을 개선해야하며 일부 시나리오에서는 성능을 크게 향상시킬 수 있습니다. 예를 들면 :

bool[] keepColumn = new bool[table.Columns.Count]; 

for (int i = 0; i < table.Rows.Count; i++) 
{ 
    for (int j = 0; j < table.Columns.Count; j++) 
    { 
     if (!keepColumn[j] && 
      !string.IsNullOrWhiteSpace(table.Columns[j].ToStringOrNull())) 
     { 
      keepColumn[j] = true; 
     } 
    } 
} 

for (int i = table.Columns.Count - 1; i >= 0; i--) 
{ 
    if (!keepColumn[i]) 
    { 
     table.Columns.RemoveAt(i); 
    } 
} 

그것은 분명 좀 더 자세한하지만 그것은 (컬럼에 반대, 즉 테이블, 자연적으로 열이 행 그들의 자연적인 조직의 데이터를 처리 있기 때문에 이럴 그것은,이 경우 가치가있을 것입니다 행이 있음).