2010-08-08 2 views
0

중복이 여러 값일 수있는 단일 텍스트 열 '제목'이있는 데이터 테이블을 사용했습니다. 나는 데이터보기를 사용하여 중복을 제거 할 수 있습니다.데이터 테이블에서 각 고유 값에 대한 중복 수 얻기

DataView v = new DataView(tempTable); 
tempTable = v.ToTable(true, "Title"); 

그러나 반복없이 각 고유 값에 대해 중복 수를 얻으려면 어떻게해야합니까?

답변

1

루프를 사용하거나 Linq를 사용하고 싶지 않으므로이를 수행 할 방법이 없지만 데이터 테이블에서 계산할 수있는 조건이 하나 더 있으면 계산할 수 있습니다. 데이터는 이와 같이 두 개의 관련 테이블에 있어야합니다.

DataRelation rel = new DataRelation("CustToOrders", data.Tables["Customers"].Columns["customerid"], data.Tables["Orders"].Columns["customerid"]); 
data.Relations.Add(rel); 

Orders 테이블에 해당 고객 ID 필드를 외래 키로 지정하면 중복 된 값이됩니다. 다음과 같이 중복 횟수를 확인할 수 있습니다.

data.Tables["Customers"].Columns.Add("Duplicates", 
    GetType(Decimal), "Count(child.customerid)"); 
0

방법 나는 당신이 다음과 같이 보일 것입니다 원하는 결과를 얻을 것이다 :

tempTable.Rows.Cast<DataRow>() 
    .Select(dr => Convert.ToString(dr[0])) 
    .GroupBy(dr => dr) 
    .Select(g => new { Title = g.Key, Count = g.Count() }); 

그러나, 실제로 후드 루프입니다. 사실, 나는 각 레코드를 조사하지 않고 그런 종류의 그룹화를하는 방법을 생각할 수 없다.

단점은 그 표현식의 결과가 일련의 익명 형식 인스턴스라는 것입니다. 여전히 결과를 DataView로 만들려면 마지막 Select를 다시 작성하여 두 개의 열이있는 새 DataRow를 만들고 DataView로 전달하는 새 DataTable로 밀어 넣습니다.

+1

Linq를 사용하는 것이 축복이 아닙니다. – NLV

+0

'tempTable.AsEnumerable()'으로'tempTable.Rows.Cast ()'을 대체 할 수 있습니다. –

관련 문제