我可以通过使用匿名类型更简洁地表达这一点吗?
本文关键字:地表 简洁 这一点 类型 可以通过 | 更新日期: 2023-09-27 18:12:47
switch(ID)
{
case "CustomReportsContainer":
foreach (var report in SessionRepository.Instance.CustomReports.ToList())
{
var reportItem = new RadListBoxItem(report.Name, report.ID.ToString());
if (!Items.Any(item => int.Equals(item.Value, reportItem.Value)))
{
Items.Add(reportItem);
}
}
break;
case "HistoricalReportsContainer":
foreach (var report in SessionRepository.Instance.HistoricalReports.ToList())
{
var reportItem = new RadListBoxItem(report.Name, report.ID.ToString());
if (!Items.Any(item => int.Equals(item.Value, reportItem.Value)))
{
Items.Add(reportItem);
}
}
break;
}
HistoricalReports和CustomReports是不同类型的集合,但我对每个对象类型的相同两个属性感兴趣。我认为我应该能够使用LINQ的Select,并创建一个匿名类型对象的列表。
但是,我不能在不赋值的情况下创建隐式类型变量。由于我在Switch语句的作用域内…我不能在switch语句中赋值给var,然后把剩下的代码移到switch语句之外。我应该如何表达这段代码?当前的实现是"最好的"吗?
Uggh,关闭。我能用这个做点什么吗?它是通过我们的API,所以我不能再修改了。
ReportServices.GetAllCustomReports().Select(report => new { report.Name, report.ID} ).ToList().ForEach(customReport => _customReports.Add(customReport));
Error 2 Argument 1: cannot convert from 'AnonymousType#1' to 'CableSolve.Web.Dashboard.IReport'
CustomReport
和HistoricalReport
应该实现一个包含Id
和Name
属性的IReport
接口(至少)
switch(ID)
{
case "CustomReportsContainer":
AddReportItems(SessionRepository.Instance.CustomReports);
break;
case "HistoricalReportsContainer":
AddReportItems(SessionRepository.Instance.HistoricalReports);
break;
}
private void AddReportItems(IEnumerable<IReport> reports)
{
foreach (var report in reports)
{
var reportItem = new RadListBoxItem(report.Name, report.ID.ToString());
if (!Items.Any(item => int.Equals(item.Value, reportItem.Value)))
{
Items.Add(reportItem);
}
}
}
编辑
在回答您的其他问题时,GetAllCustomReports
是否有可能返回实现IReport
接口的类型?这将消除通过Select(report => new { report.Name, report.ID} )
投射到匿名类型的需要,并且应该解决剩余的问题。
如果项目共享一个接口或基类型(或者您可以更改它们以便它们共享)-那么您将能够基于该类型表达LINQ查询。
dynamic
,因为它们共享相同的属性。如果您正在寻找相同的两个属性,并且它们具有相同的名称,那么您可能有一个小型界面的良好候选?