如何在C# DataTable中使用LINQ将日期时间列的月份与其他列拼接生成指定格式数据
解决方案:正确提取月份并拼接目标格式
看起来你离预期结果只差几步啦!问题主要出在没有对日期做针对性处理,直接用了完整的收款日期字符串,还有一些小细节没到位。我来帮你修正并解释清楚:
现有代码的问题分析
- 未提取日期中的月份:你直接把完整的收款日期和员工名称拼接,而不是提取月份部分,这会导致结果包含多余的日期信息,不符合需求;
- 缺少分隔符定义:代码里用了
Separator变量但没声明,会引发编译错误; - 拼接逻辑不符合目标格式:原逻辑只是简单拼接两个字段的原始值,没有按照
Emp-月份的格式处理。
修正后的LINQ代码
using System.Globalization; // 需要引入这个命名空间处理日期解析 // 定义分隔符 string Separator = "-"; DataTable _SourceTable = GetCollectionDataTable(); // 第一步:提取并拼接目标格式字符串,去重排序 var formattedItems = _SourceTable.AsEnumerable() .Select(row => { // 按指定格式精确解析收款日期(避免区域设置导致的解析错误) DateTime collectionDate = DateTime.ParseExact( row.Field<string>("Collection Date"), "dd/MM/yyyy", CultureInfo.InvariantCulture); // 将月份格式化为两位字符串(比如4月转为"04") string monthPart = collectionDate.Month.ToString("00"); // 获取员工名称 string empName = row.Field<string>("Emp"); // 拼接成目标格式 return $"{empName}{Separator}{monthPart}"; }) .Distinct() // 去除重复的拼接结果 .OrderBy(item => item) // 按字符串顺序排序 .ToList(); // 第二步:如果需要转换为目标DataTable结构 DataTable resultTable = new DataTable(); resultTable.Columns.Add("Division", typeof(string)); foreach (string item in formattedItems) { resultTable.Rows.Add(item); }
代码关键说明
- 日期精确解析:用
DateTime.ParseExact指定dd/MM/yyyy格式解析日期,避免因系统区域设置不同导致的解析错误; - 月份格式化:通过
ToString("00")把月份转为两位字符串,保证格式统一(比如1月显示为"01"); - 直接生成目标格式:一步到位拼接出
Emp-MM的字符串,逻辑更清晰; - 去重与排序:
Distinct()去掉重复项,OrderBy()按字符串顺序排序,最终得到你想要的结果顺序。
最终验证结果
运行这段代码后,会生成完全符合你需求的数据:
| Division |
|---|
| ABC-04 |
| XYZ-04 |
| ABC-05 |
内容的提问来源于stack exchange,提问作者Amit Khandelwal
相关产品推荐
相关产品推荐

