2012-03-27 2 views
1

데이터 테이블 열에서 고유 값을 얻으려고합니다. 여기에이 코드는 값으로 System.Data.DataRow의 4 개 행을 반환고유 값을 반환하는 Linq를 사용하여 Datable 쿼리

var sourceItems = ds.Tables[0].AsEnumerable() 
           .GroupBy(x => x.Field<string>("Source").ToString()) 
           .Select(x => x.First()); 
ddlSource.DataSource = sourceItems; 
ddlSource.DataBind(); 

내 코드는 ...입니다. 행 유형이 아닌 행에 저장된 실제 값이 필요합니다. 또한이 코드는 열의 고유 한 값만 가져 오는 적절한 방법입니까? .ToList() 생략 될 수 있음을

var sourceItems = ds.Tables[0].AsEnumerable() 
           .Select(x => x.Field<string>("Source")) 
           .Distinct() 
           .ToList(); 

참고하지만, 물론 그것은 ddlSource 개체의 DataSource 속성이 받아 들일 수에 따라 달라집니다 :

답변

4

나는 같은 것을 할 것입니다. Winforms 컨트롤이라면 ToList이 필요하다고 생각합니다.

코드는 기본적으로이 코드와 동일하지만 마지막 한글 SelectSelect(x => x.Key)으로 변경하여 첫 번째 행이 아닌 행을 그룹화하는 데 사용되는 값을 선택해야합니다.
또한 Distinct을 사용하는 것보다 더 많은 오버 헤드가 발생합니다. GroupBy은 원래 컬렉션의 하위 그룹을 생성하기 때문입니다.

+0

추가 된 코드에 대한 설명. – digEmAll

+0

Shabam! 고맙습니다! – cgatian

0

.Distinct 확장 방법을 사용하지 않는 이유는 무엇입니까?

ds.Tables[0].AsEnumerable() 
    .Select(x => x.Field<string>("Source").ToString()) 
    .Distinct() 
    .FirstOrDefault(); 
0

방법에 대한

var sourceItems = ds.Tables[0].AsEnumerable() 
         .Select(x => x.Field<string>("Source")) 
         .Distinct() 
         .ToList(); 
    ddlSource.DataSource = sourceItems; 
    ddlSource.DataBind(); 

(당신은 문자열에 .ToString()를 호출 할 필요는 없다, 그래서 나는 그것을 제거했습니다.)

+0

잘 작동하지만 드롭 다운에 다시 표시 할 때 어떤 이유로 든 각 줄마다 1 자씩 표시됩니다. 데이터 소스로 설정하기 전에 sourceItem을 List 또는 datable 또는 다른 것으로 변환해야합니까? –

+0

@NickLaMarca 거기에는 몇 가지 가능성이 있습니다. 아마 .ToList()를 호출하면 문제가 해결됩니다. 그에 따라 코드를 편집했습니다. – phoog

관련 문제