c# - 在 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();
}
}
}
解决方案
如果我正确理解了您的问题,那么这将解决它(尽管它很丑陋)。
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]]);
}
推荐阅读
- android - 我可以有多个具有相同项目布局的回收站视图吗?
- asp.net-core-webapi - API NET CORE:错误:400“'I' 是值的无效开始。路径:$ | LineNumber:0 | BytePositionInLine:0。”
- python - 如何修复模块“tensorflow.python.keras.activations”没有属性“get”错误?
- amazon-rds - 连接到 AWS MariaDB 并使用 boto3 运行查询
- java - 尝试执行简单的 servlet 程序时出现错误。映射中是否缺少任何东西?
- node.js - NodeJS Bull queue.add 字符串化数据导致错误
- java - 使用位图时,Android MLKit 人脸检测未检测到人脸
- javascript - Javascript 中的电子邮件验证 - 如何添加额外条件
- html - 用于多个 img 元素的图像/svg 的最佳实践是什么?
- containers - 为什么会有一个挥之不去的 podman 进程?