【问题标题】:Search List<entity> for Records with matching value for a Class Property?在列表<entity> 中搜索具有匹配值的类属性的记录?
【发布时间】:2014-12-03 09:01:48
【问题描述】:

我在我的 ASP.Net Forms 应用程序中创建了一个 Model 类,名为 Years_Of_Service

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace PROJECT.Models.Default
{
    public class Years_Of_Service
    {
        public int Year { get; set; }
        public string FiscalYear
        {
            get
            {
                return Year + "-" + (Year + 1);
            }
        }
        public decimal ServiceCredited { get; set; }
        public decimal Salary { get; set; }
        public string CoveredEmployer { get; set; }


        public string TotalService { get; set; }
        public string PurchasedorReinstatedService { get; set; }
    }
}

我已成功查询我的数据库并通过我的自定义控件在此模型类中返回适当的值,但是在某些特定情况下,我返回的记录具有相同的 [Year] 值:

我现在需要做的是遍历列表中的每个实体,如果 2 个或更多实体具有 [Year] 的匹配值,则将它们合并在一起并将 [Covered Employer] 的值更改为“Multiple Employers” .

一个简单的 foreach 循环将带我浏览每个实体,但我不知道如何对每个 OTHER 实体进行子搜索以查找匹配的 [Year] 值并将 2 组合起来。任何人都可以指出我在正确的方向上如何最好地实现这一点?

这是我目前拥有的自定义控件页面代码:

public partial class YearsOfService : System.Web.UI.UserControl
{
    public List<Years_Of_Service> lyos { get; set; }
    public Years_Of_Service y_o_s { get; set; }


    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            ApplyData();
        }
    }

    private void ApplyData()
    {

        foreach (Years_Of_Service yearsOfService in lyos)
        {
            // Search [lyos] for records with same [Year] value (ex. "2009-2010")
            // If found, Add the [Service] & [Salary] Values together under one [Year] record.
            // Change the newly "merged" record to say "Multiple Employers" for [CoveredEmployer]
        }

        salaryGridView.DataSource = lyos;
        salaryGridView.DataBind();

        if (y_o_s.TotalService.ToString() != null)
        {
            creditSalLabel.Text = y_o_s.TotalService.ToString();
        }
        else
        {
            creditSalLabel.Text = String.Empty;
        }

        if (y_o_s.PurchasedorReinstatedService.ToString() != null)
        {
            purchaseCreditLabel.Text = y_o_s.PurchasedorReinstatedService.ToString();
        }
        else
        {
            purchaseCreditLabel.Text = String.Empty;
        }
    }
}

【问题讨论】:

  • 深思熟虑:if (y_o_s.TotalService.ToString() != null) 不好。
  • 对更好的方法有什么建议(现在和将来)?
  • 记住经验法则,当你使用一个方法/属性时,要了解它的实际用法。现在,考虑ToString(),它总是返回一个字符串。但如果您的对象为空,则该对象 ToString 是一个错误。也就是说,检查if(y_o_s.TotalService != null) 是正确的方法。
  • 很公平,感谢您的洞察力。我想我最初有这种方式只是因为我试图弄清楚我在哪里/为什么在另一个问题上得到NullReferenceException

标签: c# asp.net list search webforms


【解决方案1】:

您需要使用group by approach

应该是这样的:

var groupedByYearLyos = lyos.GroupBy(x => x.Year)
    .Select(x => new Years_Of_Service() 
        { 
            CoveredEmployer = x.Count() > 1 ? "Multiple Employers" : x.First().CoveredEmployer,
            Year = x.Key,
            Salary = x.Sum(y => y.Salary)
             //and etc 
        })
    .ToList();

【讨论】:

  • 如果组数 = 1,CoveredEmployer 不应更改为 "Multiple Employers"
  • 感谢弗拉基米尔的回复。我想这正是我要找的东西!现在我只需要完成当前年份值的编码(单独完成的奇怪计算)。离开 400 人,走向未来的喜悦!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多