2014-10-28 90 views
1

所以我有報告列表,並且每個報告對象都有一個ParameterCollection(它繼承了CollectionBase),其中包含該集合中的每個Parameter。我想獲得所有報告中的獨特參數。使用LINQ從對象列表中獲取一個不同的參數列表

我已經通過循環遍歷列表中的每個報告,然後遍歷集合中的每個參數,添加到一個臨時列表,然後使用.Distinct(),但我想到了那裏工作更長(可能效率低下)的方式對於LINQ來說是更好的方法,但我無法完全理解它。試過Select()SelectMany()的組合。

有什麼想法?謝謝!

原單碼

var reportParams = SelectedReports.ToDictionary(rpt => rpt.Name, rpt => rpt.Parameters); 
var uniqueParams = new Dictionary<string, Parameter>(); 

foreach (var collection in reportParams.Values) 
{ 
    foreach (Parameter param in collection) 
    { 
     if (!uniqueParams.ContainsKey(param.Name)) 
      uniqueParams.Add(param.Name, param); 
    } 
} 

var finalCollection = new ParameterCollection(); 

foreach (var param in uniqueParams.Values.Distinct()) 
{ 
    finalCollection.Add(param); 
} 

return finalCollection; 
+1

分享您的代碼首先要更好地瞭解你會得到什麼,什麼可以優化 – dariogriffo 2014-10-28 15:59:52

+0

什麼是報告的類型?您是否使用DevExpress報告? – Habib 2014-10-28 16:00:21

+0

@Habib添加到問題,謝謝 – Hershizer33 2014-10-28 16:05:56

回答

3
var uniqueParams = reports.SelectMany(report => report.Parameters).Distinct(); 

編輯:

var uniqueParams = reports.SelectMany(report => report.Parameters.Cast<Parameter>()).Distinct(); 
+0

這一個給我一個類型錯誤:'方法的類型參數'System.Linq.Enumerable.SelectMany (System .Collections.Generic.IEnumerable ,System.Func >)'不能從使用情況推斷。 # – Hershizer33 2014-10-28 16:10:02

+0

@ Hershizer33,可能是因爲'CollectionBase'只實現'IEnumerable',而不是'IEnumerable ',所以你必須先將它強制轉換,檢查編輯後的版本是否可以工作 – 2014-10-28 16:18:04

+0

這很好用, 'IEnumerable',但現在我無法將你的代碼的結果放到繼承'CollectionBase'的類中。我沒有像構造函數或'AddRange'這樣的有用方法(我沒有編寫它,也不能修改它)。有什麼想法嗎?在代碼中添加每個參數到'ParameterCollection'後,我總是可以做一個'foreach',並且這個將會更清晰。 – Hershizer33 2014-10-28 16:57:57

相關問題