首页 > 解决方案 > 在同一代码块中多次访问列表 - 有更好的方法吗?

问题描述

我需要根据不同的条件从单个列表中设置多个标签的值。这是我的代码:

List<RFPModel> lst = RFPModel.GetAll();  //ALL
if(lst.Count>0)
{
    lblActive.InnerText = lst.Count(a => a.StatusID == (int)ProjectStatus.Project_Active).ToString();
    lblCompleted.InnerText = lst.Count(a => a.StatusID == (int)ProjectStatus.Project_Completed).ToString();
    lblProposal.InnerText = lst.Count(a => a.StatusID == (int)ProjectStatus.Proposal_UnderProcess).ToString();
    lblProposalsRej.InnerText = lst.Count(a => a.StatusID == (int)ProjectStatus.Proposal_Rejected).ToString();
    lblRFPRec.InnerText= lst.Count(a => a.StatusID == (int)ProjectStatus.RFP_Submitted).ToString();
    lblRFPRef.InnerText= lst.Count(a => a.StatusID == (int)ProjectStatus.RFP_Rejected).ToString();
    lblRFPApp.InnerText = lst.Count(a => a.StatusID == (int)ProjectStatus.RFP_Approved).ToString();
}

恐怕这种方法可能会影响性能,因为每次您需要遍历列表的值时。任何关于更好方法的建议都将受到高度赞赏。

标签: c#asp.netperformancelinq

解决方案


使用 a GroupBy(最好在数据库IQueryable级别),然后为了增加风味,您可以ToDictionary使查找更有效

var dict = lst.GroupBy(x => x.StatusID)
             .Select(x => new { x.Key, count = x.Count() })
             .ToDictionary(x => (ProjectStatus)x.Key, x => x.count.ToString());

lblActive.InnerText  = dict[ProjectStatus.Project_Active];
lblCompleted.InnerText  = dict[ProjectStatus.Project_Completed];
...

假设是StatusID一对一的映射ProjectStatus

请注意额外的Select, 是多余的,但是如果您只想要一个列表,则添加


其他资源

Enumerable.GroupBy 方法

对序列的元素进行分组。

Enumerable.Select 方法

将序列的每个元素投影到新形式中。

Enumerable.ToDictionary 方法

从 IEnumerable 创建字典。


推荐阅读