2014-12-04 1 views
6

나는이 코드 조각이 실행되지 :LINQ 제대로

DataTable dtDataTable = …; 
var rows = dtDataTable.AsEnumerable(); 
var test = rows.Select(x => x["id"]).Distinct().Count() != rows.Count(); 
if (test) 
{ 
    MessageBox.Show("test"); 
    return false; 
} 

문제 : 테스트가 진실해야 경우 if 문에서 코드가 실행되지 않습니다. 나는 이것을 디버깅 할 수 없다 (단지 코드를 계속 실행한다).

지연/즉각적인 실행과 관련이있을 수 있지만 솔루션을 찾을 수 없다고 생각합니다. select 후에 이미 .ToList()을 추가하려고했습니다.

아이디어가 있으십니까?

+0

무엇이'rows'이고 어떤 데이터를 줄 수 있는가? 또한, 먼저'Select' 할 필요가 없습니다 ... –

+1

'x [ "id"]'를 사용하는 이유는 무엇입니까? '행 '이란 무엇입니까? – ekad

+0

'test'가 즉시 할당되므로 지연 실행이 문제가되지는 않습니다. '시험'이 사실이라고 생각하는 이유는 무엇입니까? – Codor

답변

4

먼저 DictinctDataRow 인덱서가 int 대신 Object을 반환하므로 참조로 비교할 것이라고 생각했습니다. 그래서 강력하게 입력 된 Field 확장 방법을 사용하도록 제안했습니다. 그러나 그것이 당신 문제의 이유는 아닙니다.

당신이 이유를 모르는 지금까지 내가 모든 아이디의이 고유 있는지 확인하는 당신에게 다른 (더 효율적으로) 접근 방식을 제안한다,

var ids = rows.Select(r => r.Field<int>("ID")); 
var duplicateIdChecker = new HashSet<int>(); 
bool isIdUnique = ids.All(duplicateIdChecker.Add); 
+0

수 clear,'Distinct (IEnumerable )''EqualityComparer .Default'를 사용합니다.'T'가'object'이기 때문에 참조로만 비교됩니다. –

+0

EDIT : nvm, 잠깐만 요. – Bv202

+0

@JonSkeet : 테스트 해봤는데, 잘못된 트랙에 있었던 것 같습니다. 'Object'를 반환하는 인덱서에서도 작동해야합니다. –

1

가 테스트 데이터와 코드를 시도 또한 나의 조각을 썼다 동일한 작업을위한 코드의 모든 것이 작동합니다. 그래서 나는 이드들이 정확히 비교하지 않는다고 생각한다.

DataTable dt = new DataTable(); 
dt.Columns.Add("id"); 
dt.Columns.Add("desc"); 

var dr = dt.NewRow(); 
dr[0] = 1; 
dr[1] = "prova1"; 
dt.Rows.Add(dr); 
dr = dt.NewRow(); 
dr[0] = 1; 
dr[1] = "prova2"; 
dt.Rows.Add(dr); 
dr = dt.NewRow(); 
dr[0] = 2; 
dr[1] = "prova3"; 
dt.Rows.Add(dr); 

var rows = dt.Rows.OfType<DataRow>(); 
var test = (rows.Select(row => row["id"]).Distinct().Count() != rows.Count());  
Console.WriteLine(test); 

var rows1 = dt.AsEnumerable(); 
test = rows.Select(x => x["id"]).Distinct().Count() != rows.Count(); 
Console.WriteLine(test); 
+0

뭔가 이상한 일이 내 코드에서 일어나고 있습니다. 더 이상 디버깅 할 수없는 것 같습니다. 당신이 옳기 때문에 나는 내일 이것을 들여다 볼 것입니다. 이것은 정말로 효과가있을 것입니다 ... – Bv202