2014-10-28 91 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

相关问题