如何用LINQ查询string[]中时间戳最小的CSV文件名
解决方法:用LINQ找到时间戳最小的CSV文件名
嘿,我来帮你搞定这个需求!要从你的string[] files数组里找出时间戳最小的文件名,我们可以用LINQ一步到位,还能妥善处理各种边界情况。
正确的实现代码
public string GetOldestCsvFile(string[] files) { // 先做空值与空数组检查,避免运行时异常 if (files == null || files.Length == 0) return null; // 通过LINQ关联文件名与时间戳,排序后取最旧的文件名 return files .Select(file => new { FileName = file, // 灵活提取时间戳:分割文件名后处理后缀,解析失败则设为最大值(排到最后) Timestamp = long.TryParse(file.Split('_').Last().Replace(".csv", ""), out long ts) ? ts : long.MaxValue }) .OrderBy(item => item.Timestamp) .FirstOrDefault()? .FileName; }
代码细节解释
- 空值防护:先判断输入数组是否为空或null,直接返回null避免空引用异常。
- 关联文件名与时间戳:用
Select将每个文件名转换为包含原始文件名和对应时间戳的匿名对象,确保排序后还能拿到对应的文件名。 - 通用时间戳提取:没有硬编码前缀
john_q1_,而是通过Split('_')分割文件名,取最后一段处理掉.csv后缀后解析,就算以后文件名前缀变化,代码也能正常工作;用long解析是因为时间戳可能超出int的取值范围,解析失败的文件会被设为最大时间戳,自动排到最后不影响结果。 - 排序取结果:按时间戳升序排序后,取第一个元素的文件名就是我们要的最旧文件。
你现有代码的问题调整
看了你编辑的代码,有几个关键点需要修正:
- 方法返回类型应该是
string而不是void,因为你需要返回文件名。 - 硬编码替换前缀的方式不够灵活,改用分割字符串的方式适配更多可能的文件名格式。
- 你只提取了时间戳,但需求是返回对应的文件名,所以必须保留文件名和时间戳的关联关系。
- 用
int存储时间戳存在溢出风险,建议用long类型更稳妥。
调整后调用这个方法,就能得到你想要的john_q1_1527421034.csv这类时间戳最小的文件名啦。
内容的提问来源于stack exchange,提问作者Michael D.
相关产品推荐
相关产品推荐

