[英]Linq Distinct not bringing back the correct results
我正在嘗試使用Linq
從DataTable
選擇不同的值。 DataTable
從excel表中填充,該表具有動態列,除了每個excel表具有列名稱SERIAL NUMBER
,這是必需的。
我有一個用於演示目的的DataTable
,它由4個序列號組成:
當我做
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.