C#中如何将多个Tuple返回值拼接为单个字符串
问题根因
你当前代码在遍历每个工作区条目时,都会立即调用消息发送方法推送单条统计结果,因此所有结果会作为独立字符串单独发送,无法合并为一个完整内容块。另外原时长统计逻辑存在缺陷:相同StoryID下的工时不会正确累加,每次匹配到相同ID时累计值会被重置为0,统计结果不准确。
修复方案
- 循环外初始化字符串构造器收集所有统计结果,避免循环内频繁拼接字符串的性能损耗
- 移除循环内的单次发送逻辑,每计算完一个工作区的统计数据,就将格式化后的文本追加到总内容中
- 修正
GetEntryData方法的工时累加逻辑,保证相同StoryID下的工时正确累计 - 所有条目遍历完成后,仅调用一次消息发送方法,传入拼接完成的完整内容即可
修改后的可直接运行代码如下:
using System.Text; static async void NotifyEntriesByWorkSpace(Dictionary<string, List<TimeEntry>> EntriesByWorkspace, string strChatURL) { StringBuilder contentBuilder = new StringBuilder(); foreach (var entry in EntriesByWorkspace) { var timeEntry = entry.Value; string prevStoryId = string.Empty; string workspaceTitle = string.Empty; int totalMins = 0; foreach (var item in timeEntry) { var entryData = GetEntryData(prevStoryId, item, totalMins); prevStoryId = entryData.Item1; totalMins = entryData.Item2; workspaceTitle = entryData.Item3; } string lineText = $"{workspaceTitle}: {totalMins / 60} hour(s) {totalMins % 60} min(s)"; Console.WriteLine(lineText); contentBuilder.AppendLine(lineText); } // 所有内容拼接完成后一次性发送 await sendMessage(strChatURL, contentBuilder.ToString().TrimEnd()); } static Tuple<string, int, string> GetEntryData(string prevStoryId, TimeEntry item, int currentAccumulatedMins) { string storyId = item.StoryID; string title = Workspaces.getWorkspaceFromCache(item.WorkspaceID).Title; int newTotalMins = currentAccumulatedMins + item.TimeInMinutes; string newPrevStoryId = prevStoryId == storyId ? prevStoryId : storyId; return Tuple.Create(newPrevStoryId, newTotalMins, title); }
效果说明
- 所有工作区的工时统计结果会按行拼接在同一个内容块中,格式和原单条发送时保持一致
- 修正后的统计逻辑可以正确累计同一StoryID下的所有工时,不会出现统计值偏小的问题
- 仅发送一次消息,不会产生多条分散的推送
内容的提问来源于stack exchange,提问作者Très254
相关产品推荐
相关产品推荐

