2015-01-14 12 views
1

나는 코드 나는 그들이 다른 모음에없는 경우 수집에서 약간의 "일"을 제거 할는 DataTable의에서를 DataColumn을 제거하는 방법 프로그래밍

foreach (DataColumn dataTableCol in this.dataTable.Columns) 
      { 
       bool columnFound = false; 
       foreach (GRTColumnView uiColumn in descriptor.UIColumns) 
       { 
        if (dataTableCol.ColumnName.Equals(uiColumn.Name)) 
        { 
         columnFound = true; 
         break; 
        } 
       } 

       if (!columnFound) 
       { 
        if (this.dataTable.Columns.Contains(dataTableCol.ColumnName)) 
         this.dataTable.Columns.Remove(dataTableCol.ColumnName); 
       } 

      } 

에게 있습니다.

내가 위 프로그램을 실행하면, 나는 모음이

을 수정로

반복이 "컬렉션이 수정되었습니다"를 실행하지 않을 수 있습니다 얻을 - 제거가

에 충돌되어 있어야합니다 사촌을

그런 일을 성취하는 방법은 무엇입니까? 내가 생각할 수있는 어떤

내가 다른 루프를해야로서, 나에게 좋은 방법을하지 않는 것 같습니다 위의 제거 모든 "일"에 주목하고

foreach(aThing in all_things_to_remove) 
    remove_from_collection(aThing) 

을 할 것입니다하지만 여분의 메모리를 사용하고 있습니다.

+1

루프 백 워드 ... – Plutonix

+0

@Plutonix 이걸 좋아하니? 'for (inedx = this.dataTable.Columns.Count - 1; index> = 0; index ++)'또는 더 좋은 방법이 있습니까? – SimpleGuy

답변

2

: 당신은 당신이 이런 식으로 코드를 편집 할 수 있습니다 당신이 수정하고 같은 컬렉션을 반복하지 다시하기 :

foreach (var dataTableCol in dataTable.Columns.Cast<DataColumn>().ToList()) 
{ 
    ... 

    dataTable.Columns.Remove(dataTableCol.ColumnName); 
} 

권장되는 방법, 컬렉션가 큰 특히, 뒤로 열거하는 것입니다

for (var i = dataTable.Columns.Count - 1; i >= 0; i--) 
{ 
    ... 

    dataTable.Columns.Remove(dataTable.Columns[i].ColumnName); 
} 
+0

답변 해 주셔서 감사합니다. 제 경우에는, 당신은 수집이 작다고 말했지만, 제 수집이 큰 것이면 어떨까요? 복사를 피하는 방법이 있었습니까? – SimpleGuy

0

foreach 루프를 사용하여 열거하는 동안 컬렉션에서 항목을 제거 할 수 없습니다. Collection.ToArray()을 사용하여 컬렉션을 복사하고 foreach를 실행하여 실제 컬렉션에서 항목을 제거하십시오.

DataTable.Columns에는 ToArray 또는 ToList 메서드가 없으므로 CopyTo() 메서드를 사용하고 전체 열을 ColumnsArray에 복사 할 수 있습니다.

복사본을 만들지 않으려면 foreach 루프 대신 for 루프를 사용할 수 있습니다. '당신 있도록, 당신은 단지 (ToList()를 통해) 새 컬렉션을 만들 수 있습니다 당신은 몇 열을 포함하는 작은 컬렉션을 반복하고이 특정한 경우에

for (int i = 0; i < dataTable.Columns.Count; i++) 
{ 
    bool columnFound = false; 
    foreach (GRTColumnView uiColumn in descriptor.UIColumns) 
    { 
     if (dataTable.Columns[i].Name.Equals(uiColumn.Name)) 
     { 
      columnFound = true; 
      break; 
     } 
    } 

    if (!columnFound) 
    { 
     if (this.dataTable.Columns.Contains(dataTableCol.ColumnName)) 
      this.dataTable.Columns.Remove(dataTableCol.ColumnName); 
    } 

} 
+0

글쎄, 나는 그 오류에서 알아. 나는 탈출구를 요구하고있다. 그리고 당신이 제안하는 방식으로, 나는 이미 내 질문에 비슷한 접근법을 지적했고 그것은 나에게 좋지 않다. – SimpleGuy

+0

그건 제대로 작동하지 않을 것이다. 역순으로 열거하지 않으면 모든 다른 열을 모두 제거하게됩니다 (다른 열을 건너 뜁니다). 기본적으로, 만약 당신이 6 개의 열을 가지고 있고 이것들을 사용하여 모두 'for' 루프를 사용하여 제거하려고 시도한다면, 당신은 그것들 중 3 개만을 제거 할 것입니다. –

0

다른 방법은 열을 제거한 후 색인을 낮추는 것입니다.

for (int i = 0; i < datatable.Columns.Count; i++) 
      { 
       if (datatable.Columns[i].ColumnName.Contains("Column")) 
       { 
        datatable.Columns.RemoveAt(i); 
        i--; 
       } 
      }