簡體   English   中英

Linq Distinct沒有帶回正確的結果

[英]Linq Distinct not bringing back the correct results

我正在嘗試使用LinqDataTable選擇不同的值。 DataTable從excel表中填充,該表具有動態列,除了每個excel表具有列名稱SERIAL NUMBER ,這是必需的。

我有一個用於演示目的的DataTable ,它由4個序列號組成:

  • 12345
  • 12345
  • 98765
  • 98765

當我做

var distinctList = dt.AsEnumerable().Select(a => a).Distinct().ToList();

如果我做

var distinctList = dt.AsEnumerable().Select(a => a.Field<string>("SERIAL NUMBER").Distinct().ToList();

然后我得到了正確的結果,但是它只包含來自dt的一列而不是所有其他列

我得到所有四個記錄而不是2.有人可以告訴我我哪里出錯了。

問題是默認情況下, Distinct方法使用默認的相等比較器, DataRow通過引用進行比較。 要獲得所需的結果,可以使用Distinct 重載 ,它允許您傳遞IEqualityComparer<T> ,並傳遞DataRowComparer.Default

DataRowComparer <TRow>類用於比較DataRow對象的值,而不比較對象引用。

var distinctList = dt.AsEnumerable().Distinct(DataRowComparer.Default).ToList();

有關更多信息,請參閱比較DataRows(LINQ to DataSet)

在ToTable方法中,第一個參數指定是否需要Distinct記錄,第二個參數指定我們將使哪個列名稱不同。

DataTable returnVals = dt.DefaultView.ToTable(true, "ColumnNameOnWhichYouWantDistinctRecords");

這里沒有必要使用linq來完成這項任務!

那么,您想按序列號對它們進行分組並檢索完整的DataRow嗎? 假設在對它們進行分組后我們想要檢索第一個項目:

var distinctList = dt.AsEnumerable().GroupBy(a => a.Field<string>("SERIAL NUMBER"))
                       .Select(a => a.FirstOrDefault()).Distinct().ToList();

編輯:根據要求

var distinctValues = dt.AsEnumerable().Select(a => a.Field<string>("SERIAL NUMBER")).Distinct().ToList();
var duplicateValues = dt.AsEnumerable().GroupBy(a => a.Field<string>("SERIAL NUMBER")).SelectMany(a => a.Skip(1)).Distinct().ToList();
var duplicatesRemoved = dt.AsEnumerable().Except(duplicateValues);

使用Linq,GroupBy會更好地適應它。

var groups = dt.AsEnumerable().GroupBy(a => a.SerialNumber).Select(_ => new {Key = _.Key, Items = _});

然后,這將包含基於序列號的分組。 每組項目具有相同的序列號,但其他屬性值不同。

嘗試這個:

List<string> distinctValues = (from row in dt.AsEnumerable() select row.Field<string>("SERIAL NUMBER")).Distinct().ToList();

不過對我來說這也有效:

List<string> distinctValues = dt.AsEnumerable().Select(row => row.Field<string>("SERIAL NUMBER")).Distinct().ToList();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM