2011-10-04 3 views
0

다음 코드의 방법 1이 다른 두 메서드가 수행하는 DataTable을 변경하지 않는 이유를 정확하게 설명 할 수 있습니까?이 DataRow가 변경되지 않은 이유를 설명하십시오.

분명히 어떤 종류의 참조 문제이지만 정확히 어떤 이유입니까? 바보 테스트 데이터 :)위한

CODE AT IDEONE HERE

Imports System 
Imports System.Data 

Public Class Test 

     Public Shared Sub Main() 
       'Build Table 
       Dim dt as New DataTable 
       dt.Columns.Add("ID",GetType(String)) 
       dt.Columns.Add("Name",GetType(String)) 

       'Populate Table 
       Dim dr as DataRow 
       dr = dt.NewRow() 
       dr("ID")="Man" : dr("Name") = "mike" : dt.Rows.Add(dr) 
       dr = dt.NewRow() 
       dr("ID")="Man" : dr("Name") = "ian" : dt.Rows.Add(dr) 
       dr = dt.NewRow() 
       dr("ID")="Man" : dr("Name") = "rob" : dt.Rows.Add(dr) 
       dr = dt.NewRow() 
       dr("ID")="Woman" : dr("Name") = "ann" : dt.Rows.Add(dr) 
       dr = dt.NewRow() 
       dr("ID")="Woman" : dr("Name") = "sam" : dt.Rows.Add(dr) 

       output(dt)  'Output Table 

       Dim drFilters() as DataRow = dt.Select("ID='Man'")  'Select all Man 

       'Method 1 does not change dt 
       'dr = dt.NewRow() 
       'dr("ID")="cowman" : dr("Name")="bugle" 
       'drFilters(1)=dr 

       'Method 2 does change dt 
       dr = drFilters(1) 
       dr("ID")="cowman" : dr("Name")="bugle" 

       'Method 3 does change dt 
       'drFilters(1)("ID")="cowman" : drFilters(1)("Name")="bugle" 

       output(dt) 'Output final table 
     End Sub 

     Public Shared Sub output(dt as DataTable) 
       for each dr as DataRow in dt.Rows 
         Console.WriteLine(dr("ID") + vbTab + dr("Name")) 
       Next 
       Console.WriteLine("") 
     End Sub 

End Class 

사죄

drFilters(1)=dr 전화

답변

2

경우의 행 참조는 별도의 집합 인 필터 컬렉션에서 DataRow 참조를 교환 한 DataTable 그 자체. dt.RowsdrFilters()과 같이 DataRow 개체에 대한 참조 목록이지만 참조 목록의 항목을 변경해도 다른 참조 목록에는 영향을주지 않습니다.

dt.Rows 
0 => dt.Rows(0) 
1 => dt.Rows(1) 
2 => dt.Rows(2) 
3 => dt.Rows(3) 
4 => dt.Rows(4) 

drFilter() 
0 => dt.Rows(0) 
1 => dt.Rows(1) 
2 => dt.Rows(2) 

drFilters(1)=dr에 대한 호출 후, 컬렉션 dt.Rows가 변경되지 않습니다 것을이

dt.Rows 
0 => dt.Rows(0) 
1 => dt.Rows(1) 
2 => dt.Rows(2) 
3 => dt.Rows(3) 
4 => dt.Rows(4) 

drFilter() 
0 => dt.Rows(0) 
1 => dr 
2 => dt.Rows(2) 

주처럼 보인다. 그러나 객체 drFilters(1)을 검색하여 변경하면 dt.Rows(1)에 대한 참조가 있으므로 해당 속성의 변경 내용은 dt의 결과에 반영됩니다.

희망이 도움이됩니다.

+0

+1 감사합니다. 훌륭한 답변입니다. 매우 분명 지금 :) –

+0

좋은 대답. 나는 그것이 이미 효과가 있었는지 이해했으며, 나는 여전히 더 잘 우적 우적하다고 생각한다. :) – Chris

관련 문제