我需要從 studentids 串列中查找不包含值的記錄。沒有 1:1 匹配欄位。記錄包含 3 個關鍵欄位,并且根據條件,我必須與 studentids 串列進行比較。
例如:如果原始資料記錄具有非空的 studentnumber 值,那么我必須連接 studentnumber 和 sequencenumber 并檢查該組合是否存在于 studentids 串列中。否則,我必須連接 EnrollNumber 和 SequenceNumber。
我正在嘗試在 contains 中使用三元運算子,如下所示,
var studentIDs = students.Select(x => x.StudentID).Distinct().ToList();
var rawData = StudentManager.GetAllData();
var resultList = rawData.Where(x => !studentIDs.Contains($"{(!string.IsNullOrWhiteSpace(x.StudentNumber)? (x.StudentNumber x.SequenceNumber):(x.EnrollNumber x.SequenceNumber))}")).ToList();
然而,對于更大的資料集(超過 5K),它似乎變得更慢。任何關于替代方法或改進方法的建議將不勝感激。尤其是如果可以簡化Contains 中的代碼(三元運算子)。
uj5u.com熱心網友回復:
正如@derpischer 在推薦中提到的,您是否嘗試過使用 HashSet?
將第一行替換為以下內容:
var studentIDs = new HashSet<string>(students.Select(x => x.StudentID));
這將加快您的執行時間。請讓我知道它是否有效。
uj5u.com熱心網友回復:
我認為你的邏輯方法很好。我認為您可以以更清晰、更輕松的方式呈現它。考慮以下問題:
HashSet<string> studentIDs = students.Select(s => s.StudentID)
.ToHashSet();
string StudentID(RawDataStudent s) => string.IsNullOrWhiteSpace(s.StudentNumber)
? $"{s.EnrollNumber}{s.SequenceNumber}"
: $"{s.StudentNumber}{s.SequenceNumber}";
var rawData = StudentManager.GetAllData();
var resultList = rawData.Where(s => !studentIDs.Contains(StudentID(s)))
.ToList();
要點:
- 拉出整個“包含”lambda 并將其呈現為具有意圖的明確命名的函式 - 良好的可讀性
- 總是嘗試使用布林值進行肯定的作業 - 特別是你最終得到了這個帶有空值或空格的奇怪括號否定,只需切換回傳值 - 再次更容易閱讀
- 正如其他海報評論的那樣,對 HashSet 呼叫 contains 會快得多
- 注意我已經假設你的 GetAllData 回傳型別有點 - var 有點邪惡的好例子
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/392401.html
上一篇:C#分組物件未按預期進行變異
