foreach 구문 처리 속도가 점점 느려집니다.

@suwoo @lvh0270
DataTable 을 재사용할 목적으로 var newRow = dt.NewRow(); 했다면
둘 중 하나가 아니라 반드시 dt.Rows.Add(newRow); 를 한 후 dt.Rows.Remove()dt.Rows.Clear() 를 해야한다는 얘기임다.

4개의 좋아요

아, remove를 꼭 해야한다는 말이었군요. 감사합니다.

2개의 좋아요

음…제가 깃허브에 올렸던 코드에는 dt.Rows.Clear();를 사용을 했는데

위에 답글 다셨던 게 그거랑은 관련 없이 dimohy님의 코드에 대한 코멘트이신 거죠??

2개의 좋아요

넵 ^^;

2개의 좋아요

DataTable의 NewRow()를 호출하면 DataTable 내의 recordManager에서 새로 생성된 DataRow에 대한 참조를 갖게 되는데, AddRow() 메소드 내에서 호출되는 SetNewRecordWorker() 메소드 내에서 참조가 제거되기 전까지 그대로 방치되는 게 아닐까 싶어요.

MS Docs에서도 NewRow() 호출 시 테이블에 추가하거나 테이블에서 제거하라고 되어 있네요.

7개의 좋아요

MS Docs에서

When you use NewRow to create new rows, the rows must be added to or deleted from the data table before you call Clear.

제가 말씀드리려 했던게 이 부분이었거든요.
@Greg.Lee 님 께서 말씀해 주신걸 보니,
제가 or 라고 한 부분 에서 헷갈린 것 같네요.

3개의 좋아요

넵 맞습니다. 그런데 저 표현도 실제로 해보면 좀 모호한 부분이 있는데요.
(or 의 해석이 중의적인 의미를 가질 수 있어서 모호한 부분이 있어요.)

제가 말한 포인트는 dt.Rows.Add(newRow); 를 반드시 하라는 거예요.

@루나시아 님의 설명대로
var newRow = dt.NewRow(); 를 할 때 DataTable 의 참조가 보관되는 과정을 거치는데
이 때 생성된 newRow 에서 DataTable 참조를 단독으로 제거할 수 있는 방법이 없다는 거예요.
(있는지 모르겠는데 저는 못 찾앗어욜… =ㅁ=)

만약 dt.Rows.Add(newRow); 없이 그냥 dt.Rows.Remove(newRow)dt.Row.Clear() 를 하게 되면
newRow 가 dt.Rows에 할당되지 않았으므로 newRow 자체에는 아무런 영향이 없어요.
(dt.Rows.Add(newRow); 없이 dt.Rows.Remove(newRow) 를 호출하면, 없는 row 라고 아예 예외를 던집니다.)

정리하자면
var newRow = dt.NewRow();를 했다면 반드시 dt.Rows.Add(newRow); 하라!
라는 거고

이후 해당 row 를 제거해야할 경우
dt.Rows.Remove()dt.Rows.Clear() 를 반드시 사용해라!

입니다.

8개의 좋아요