C#拼接ProtocolNumber与CreationDate参数的最优实现及问题修复咨询
实现问题排查与最优方案
现有代码问题解答
1. 两次调用CreationDate.ToString()是否合理?
完全不合理。DateTime是值类型,非可空场景下调用ToString()永远不会返回空,你原有代码里的空值判断逻辑完全无效;多次调用还会产生不必要的冗余,要是两次用的格式不一致还会出现输出异常。
2. 多数据类型场景用ArrayList是否更合适?
完全不适合。ArrayList是.NET Framework早期的非泛型集合,存储不同类型数据会产生装箱拆箱开销,且类型不安全。你最终所有内容都要转为字符串输出,直接用List<string>就可以满足需求,没必要用已经被淘汰的ArrayList。
3. 第二段代码拼接异常的原因
- 三目运算符逻辑写反:
!string.IsNullOrEmpty(this.TaskReport.ProtocolNumber) ? "" : this.TaskReport.ProtocolNumber + " "这段的意思是协议号有值时返回空字符串,没值时才返回协议号,和你的需求完全相反 - 日期判断逻辑完全错误:
CreationDate.ToString("yy-MM-dd") != " "永远为真,日期转字符串不可能输出 - 完全没有把日期字符串拼入结果,自然只会偶尔出现协议号、看不到日期
最优实现方案
先统一处理两个字段的有效值,仅保留非空内容再拼接,完全避免多余分隔符、冗余调用的问题:
// 提前处理两个字段的有效值,ToString仅调用一次 string validProtocol = string.IsNullOrWhiteSpace(this.TaskReport.ProtocolNumber) ? null : this.TaskReport.ProtocolNumber.Trim(); string validDate = null; // 如果CreationDate是可空类型DateTime?,把判断条件换成this.TaskReport.CreationDate.HasValue即可 if (this.TaskReport.CreationDate != default(DateTime)) { // 按你需要的日期格式统一转换 validDate = this.TaskReport.CreationDate.ToString("dd.MM.yyyy"); } // 仅收集非空的内容 var validParts = new List<string>(); if (validProtocol != null) validParts.Add(validProtocol); if (validDate != null) validParts.Add(validDate); // 拼接单条内容,空内容默认返回 string relatedTaskHTML = validParts.Count == 0 ? " " : string.Join(" ", validParts); // 如果是多组TaskReport需要按日期倒序拼接,用下面的逻辑即可: // var relatedTaskHTML = string.Join(", ", taskReportList // .OrderByDescending(report => report.CreationDate) // .Select(report => // { // var p = string.IsNullOrWhiteSpace(report.ProtocolNumber) ? null : report.ProtocolNumber.Trim(); // var d = report.CreationDate != default(DateTime) ? report.CreationDate.ToString("dd.MM.yyyy") : null; // return string.Join(" ", new[] {p, d}.Where(x => x != null)); // }) // .Where(item => !string.IsNullOrEmpty(item))); consultationProtocol = consultationProtocol.Replace("{{ProtocolNumber}}", relatedTaskHTML);
内容的提问来源于stack exchange,提问作者user15060642
相关产品推荐
相关产品推荐

