2015-05-07 38 views
0

我試圖得到一個列的重複值的datatableDuplicate Values Not Allowed比較比Lambda表達式當前的指數只有不到索引記錄

另一列對於我分組的datatable顯示錯誤消息列和檢查存在重複或不喜歡下面

DataTable dt = new DataTable(); 
dt.Rows.Cast<DataRow>().ToList().ForEach(r => checkValidation(r, i++)); 
    private void checkValidation(DataRow Row, int RowId) 
    {   
     if ((dt.Rows.Cast<DataRow>().ToList().GroupBy(r => r[colName]).SelectMany(dup => dup.Skip(1))).Count() > 0) 
     { 
      Row["Error List"] += "Duplicate Values Not Allowed"; 
     } 
    } 

這裏的問題是,它會給出錯誤信息所有有重複的值,如下行

Name   Error List 
---------- ---------- 
Test Upload Duplicate Values Not Allowed 
Test Upload Duplicate Values Not Allowed 

,但我要的是

Name   Error List 
---------- ---------- 
Test Upload 
Test Upload Duplicate Values Not Allowed 

爲了得到它,我們只能比較比目前的指數不太索引行。但如何使用lambda表達式來做同樣的事情。

回答

0

您的代碼正在檢查的任何重複項,然後將當前行標記爲重複項。行不在驗證檢查的任何地方使用,除了分配錯誤。

如果這項工作,你會做相同的驗證ñ次,其中ñ是行數。爲什麼不以不同的方式處理這個問題並一次性進行驗證?

你可以得到所有重複的組是這樣的:

var duplicateGroups = dt.Rows 
    .Cast<DataRow>() 
    .GroupBy(r => r["Name"]) 
    .Where(g => g.Count() > 1); 

然後設置一個錯誤除了第一所有重複:

foreach (var row in duplicateGroups.SelectMany(g => g.Skip(1))) 
{ 
    row["Error List"] += "Duplicate Values Not Allowed"; 
} 

隨着我的測試數據,我得到這樣的輸出:

Name   Error List 
-------------------------------------------- 
Test Upload 
Test Upload  Duplicate Values Not Allowed 
Test Upload  Duplicate Values Not Allowed 
Test Upload 2 
Test Upload 2 Duplicate Values Not Allowed 
Test Upload 3 
+0

'dt.Rows.Cast ().GroupBy(R => R [ 「名稱」])。當(G => g.Count()> 1).SelectMany(G => g.Skip ( 1))'你是指這個? – Vallabha

+0

如果你打算把它寫成一行,那麼你可以跳過'Where(g => g.Count()> 1)',因爲Skip(1)'有效地做同樣的事情。 –

+0

我遍歷數據表並寫入錯誤列表列,這是重複的。看到編輯的問題。 – Vallabha