我可以通过使用匿名类型更简洁地表达这一点吗?

本文关键字:地表 简洁 这一点 类型 可以通过 | 更新日期: 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'

我可以通过使用匿名类型更简洁地表达这一点吗?

CustomReportHistoricalReport应该实现一个包含IdName属性的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查询。

如果没有,如果你是c# 4,你可以输入它们为dynamic,因为它们共享相同的属性。

如果您正在寻找相同的两个属性,并且它们具有相同的名称,那么您可能有一个小型界面的良好候选?