c# - 在同一代码块中多次访问列表 - 有更好的方法吗?
问题描述
我需要根据不同的条件从单个列表中设置多个标签的值。这是我的代码:
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();
}
恐怕这种方法可能会影响性能,因为每次您需要遍历列表的值时。任何关于更好方法的建议都将受到高度赞赏。
解决方案
使用 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
, 是多余的,但是如果您只想要一个列表,则添加
其他资源
对序列的元素进行分组。
将序列的每个元素投影到新形式中。
从 IEnumerable 创建字典。
推荐阅读
- javascript - 如何在对象数组中动态添加对象值
- mysql - 使用 sql 获取最高汇率
- github - 通过 if 条件在 PR 中推送提交时触发作业
- angular - 如何将当前值显示到输入字段
- laravel - 如何显示 AdminLTE 示例中显示的语言菜单
- javascript - 在 ChartJs 中绘制刻度时修改点样式
- ruby-on-rails - 如何将字符串转换为挖掘可读格式的导轨?
- javascript - 如何抽象 Javascript Promise 并保留 .then
- django - 从一个 SerializerMethodField 返回两个字段值
- android - 我正在使用 ViewModel Live 数据进行 UI 更新。我想使用 Retrofit 进行网络调用。我可以在服务(意图服务)中使用改造调用吗?