2010-07-28 3 views
0

최근 인터뷰에서 나는 이상한 질문을 받았습니다.정렬 코드의 실수를 이해할 수 없습니다.

Private Function sorttable (ByVal dt As DataTable, ByVal sorttype$, ByVal sort_direction$) As DataTable 
     Dim dv As DataView 
     Dim dt2 As DataTable 
     dt2 = dt.Clone 
     dt2.Merge(dt) 
     dv = dt2.DefaultView 
     dv.Sort = sorttype & " " & sort_direction 
     Return dv.ToTable() 
End Function 

이 기능은 올바르게 작동하지만 문제가 있습니다 (최소한 면접관이 주장함). 그게 뭔지 알 수 없었어. 어떤 생각이야?

+0

왜 태그가 C#입니까? –

+1

국가 마일을 실행하십시오. –

+2

데이터 테이블이나 데이터 세트와 관련된 인터뷰 질문은 거대한 경고 신호로 간주됩니다. – richeym

답변

1

아무 이유없이 DataTable을 만들고 있습니다.

... 당신은 같은 결과를

Private Function sorttable (ByVal dt As DataTable, ByVal sorttype$, ByVal sort_direction$) As DataTable 
     Dim dv As DataView 
     dv = dt.DefaultView 
     dv.Sort = sorttype & " " & sort_direction 
     Return dv.ToTable() 
End Function 
+0

흠 당신이 맞다고 생각합니다. 복제본을 다시 검사 한 후 – hrrrr

+0

복제본 만 데이터 테이블의 데이터 병합 데이터를 복사하지 않습니다. – hrrrr

+0

이 문제를 해결하기 위해 수정되었지만 여분의 데이터 테이블은 여전히 ​​필요하지 않았습니다. – PostMan

1

나는 DataView 또는 DataTable을 한번도 사용하지 않았지만 코드는 객체를 처리하지 않습니다.

+0

Datatable과 데이터 뷰 객체를 삭제할 수 있습니다. – hrrrr

+0

예, 확인할 수는 있지만 제공 한 코드 샘플에는 처리되지 않았습니다. 어떤 분명한 사용상의 문제가 없다면 면접관이 찾고있는 대답 일 수 있습니다. –

+0

제공되는 데이터 테이블이 두 배로 증가했습니다. 이것이 주된 문제입니다. – PostMan

0

편집 : 행이 아닌 스키마 만 병합하십시오. 그것이 당신이 필요로하는 이유입니다.

두 가지 문제점은 Merge과 중복 변수 (dt2)뿐입니다. 값으로 전달되기 때문에 로컬 복사본을 추가로 만들거나 버그가 생길 이유가 없습니다. 이것은 코드 냄새으로 알려져 있습니다. 또한 제약 조건과 스키마가 이미 포함 된 원본 데이터 테이블의 복제본을 만들 때 병합하는 이유는 무엇입니까? 그것은 두 배나되는 것 같습니다.

+0

값으로 전달 된 참조 유형이며, 'dt'는 원래 객체의 복사본이 아닙니다. –

+0

@Chris : 잘못되었습니다 - http://www.yoda.arachsys.com/csharp/parameters.html ByRef와 반대되는 DataTable을 전달하면 새 저장 위치가 만들어집니다. 참조 유형은 변수와 실제 값 –

+0

@ 0A0D 사이에 간접적 인 형태가 있음을 의미합니다. 내 기사가 내 포인트를 증명하지 않습니까? "참조 유형 변수의 값은 참조입니다. 두 개의 참조 유형 변수가 동일한 객체를 참조하면 해당 객체의 데이터가 두 변수를 통해 변경됩니다." –

0
나는 그런 좋은 대답을 creaing했다

을 제공하기 위해이 코드를 사용할 수 있지만 내 FF가 추락

몇 마디에 이렇게

..

그러나 무엇이 거기에 갈까요

  • DataTable - 하나의 메모리 데이터 테이블을 나타냅니다.

    • 복제본 - 모든 DataTable 스키마와 제약 조건을 포함하여 DataTable의 구조를 복제합니다.

    • 병합 (DataTable dataTable) -이 멤버는 오버로드됩니다. 구문, 사용법 및 예제를 포함하여이 멤버에 대한 전체 정보를 보려면 오버로드 목록에서 이름을 클릭하십시오.

    • DefaultView - 필터링 된보기 또는 커서 위치를 포함 할 수있는 표의 사용자 정의보기를 가져옵니다.

  • DataView를이 - 정렬 필터링, 검색, 편집 및 탐색 DataTable에의 databindable 맞춤형 뷰를 나타낸다.

    • 정렬 - 가져 오거나 정렬 열 또는 열, 을 설정하고 DataView를 순서를 정렬 할 수 있습니다. 정렬 문자열 구조 - "ASC"(오름차순) 또는 "DESC"(내림차순) 뒤에 열 이름이있는 문자열 기본적으로 열은 오름차순으로 정렬됩니다. 여러 열을 쉼표로 구분할 수 있습니다. " Clone 메서드는 Copy와 거의 동일하게 작동하지만 Clone 메서드로 만든 새 DataTable에는 DataRow가 들어 있지 않다는 유일한 차이점이 있습니다.어떤 경우에는

    당신은 좋은 답변으로 받아 middtime에 가지고있는 redundation

, 우리는 다른 목적으로 그 데이터의 사본을 분류하려는 예를 들어 resonable 수 있습니다. 그러나 복제 및 병합 할 필요가 없습니다. 구성원 복사는 동일한 작업을 수행합니다.

저는 전문가는 아니지만 DataView의 속성 Sort는 DataTable을 반환 할 때 DataView를 정렬하므로 아무 것도 정렬하지 않습니다.

관련 문제