首页 > 解决方案 > 在 C# 中根据月份更新列表项

问题描述

我在列表中有一组记录。现在我有一个记录很少的数据表。我的清单样本在这里:

List<TimeControlGrid> EmpList = new List<TimeControlGrid>();
EmpList = (from DataRow dr in Oracleresult.Rows
            select new TimeControlGrid()
            {
                EmpNumber = Convert.ToInt32(dr["EMPNUMBER"]),
                EmpName = dr["EMPNAME"].ToString(),
                Dept = dr["DEPT"].ToString(),
                ProjectName = dr["PROJECTNAME"].ToString(),
                ChargeDesc = dr["CHARGEDESC"].ToString(),
                ProjectCode= dr["PROJECTCODE"].ToString(),
                CostCenter= dr["COSTCENTER"].ToString(),
                Jan = Convert.ToInt32(dr["Jan"]),
                Feb = Convert.ToInt32(dr["Feb"]),
                Mar = Convert.ToInt32(dr["Mar"]),
                Apr = Convert.ToInt32(dr["Apr"]),
                May = Convert.ToInt32(dr["May"]),
                Jun = Convert.ToInt32(dr["Jun"]),
                Jul = Convert.ToInt32(dr["Jul"]),
                Aug = Convert.ToInt32(dr["Aug"]),
                Sep = Convert.ToInt32(dr["Sep"]),
                Oct = Convert.ToInt32(dr["Oct"]),
                Nov = Convert.ToInt32(dr["Nov"]),
                Dec = Convert.ToInt32(dr["Dec"]) )
            }).ToList();

我有一个具有相同列的数据表,但月份列中的值变化很少,所以这是我的要求:

首先我需要得到当前月份。如果当前月份是Jan,那么我需要使用数据表值更新列表中该记录的所有月份值。

假设如果当前月份值为12 月,那么我只需要使用数据表值更新列表中的12月值。下面是我需要应用更改的代码示例。在下面的代码中,我只是检查月份。当前月份是12 月。所以,我只需要更新Dec值。像这种方式假设如果当前月份是11 月,那么我需要更新emplist 中的11 月12 月值。

foreach(DataRow dr in SQLresult.Rows)
{
    var obj = EmpList.FirstOrDefault(x => x.EmpName == dr["EmpName"].ToString() && x.ProjectName== dr["EmpName"].ToString() && x.ChargeDesc == dr["ChargeDesc"].ToString() && x.CostCenter == dr["CostCenter"].ToString());
    if (obj != null)
    {
        if (DateTime.Now.Month.ToString() == "12")
        {
            obj.Dec = dr["Dec"].ToString();
        }
    }
}

标签: c#linq

解决方案


如果我正确理解了您的问题,那么这将解决它(尽管它很丑陋)。

foreach (DataRow dr in SQLresult.Rows)
{
    var obj = EmpList.FirstOrDefault(x => x.EmpName == dr["EmpName"].ToString() && x.ProjectName == dr["EmpName"].ToString() && x.ChargeDesc == dr["ChargeDesc"].ToString() && x.CostCenter == dr["CostCenter"].ToString());
    if (obj != null)
    {
        switch (DateTime.Now.Month)
        {
            case 1:
                obj.Jan = Convert.ToInt32(dr["Jan"]);
                goto case 2;
            case 2:
                obj.Feb = Convert.ToInt32(dr["Feb"]);
                goto case 3;
            case 3:
                obj.Mar = Convert.ToInt32(dr["Mar"]);
                goto case 4;
            case 4:
                obj.Apr = Convert.ToInt32(dr["Apr"]);
                goto case 5;
            case 5:
                obj.May = Convert.ToInt32(dr["May"]);
                goto case 6;
            case 6:
                obj.Jun = Convert.ToInt32(dr["Jun"]);
                goto case 7;
            case 7:
                obj.Jul = Convert.ToInt32(dr["Jul"]);
                goto case 8;
            case 8:
                obj.Aug = Convert.ToInt32(dr["Aug"]);
                goto case 9;
            case 9:
                obj.Sep = Convert.ToInt32(dr["Sep"]);
                goto case 10;
            case 10:
                obj.Oct = Convert.ToInt32(dr["Oct"]);
                goto case 11;
            case 11:
                obj.Nov = Convert.ToInt32(dr["Nov"]);
                goto case 12;
            case 12:
                obj.Dec = Convert.ToInt32(dr["Dec"]);
                break;
        }
    }
}

一种可能的、更清洁的选择

如果可以选择更改TimeControlGrid课程,我建议以下内容:

1. 用数组替换所有代表月份的不同属性。

public class TimeControlGrid
{
    public int EmpNumber { get; set; }
    public string EmpName { get; set; }
    public string Dept { get; set; }
    public string ProjectName { get; set; }
    public string ChargeDesc { get; set; }
    public string ProjectCode { get; set; }
    public string CostCenter { get; set; }
    public int[] Months { get; set; }
}

2. 实例化一个字典以用作映射器。

var monthMapper = new Dictionary<int, string>
{
    { 1, "Jan" },
    { 2, "Feb" },
    { 3, "Mar" },
    { 4, "Apr" },
    { 5, "May" },
    { 6, "Jun" },
    { 7, "Jul" },
    { 8, "Aug" },
    { 9, "Sep" },
    { 10, "Oct" },
    { 11, "Nov" },
    { 12, "Dec" }
};

3.用for循环代替switch。

foreach (DataRow dr in SQLresult.Rows)
{
    var obj = EmpList.FirstOrDefault(x => x.EmpName == dr["EmpName"].ToString() && x.ProjectName == dr["EmpName"].ToString() && x.ChargeDesc == dr["ChargeDesc"].ToString() && x.CostCenter == dr["CostCenter"].ToString());
    if (obj != null)
        for (int i = DateTime.Now.Month; i <= 12; i++)
            obj.Months[i - 1] = Convert.ToInt32(dr[monthMapper[i]]);
}

推荐阅读