无法在List<String>中找到最长匹配字符串的技术求助
问题排查与解决方案
我看到你遇到的问题了,咱们一步步拆解分析:
1. 核心问题:类型不匹配导致的无结果
你的GetUniquePaths方法返回的是IEnumerable<(string, int)>(字符串和索引的元组),但在Main方法里你把它赋值给了IEnumerable<string>类型的变量uniquePaths。C#不会自动将元组转换为字符串,这不仅会触发编译错误,也是你得到"enumeration yielded no results"的核心原因——类型不兼容导致后续根本无法正确遍历到有效数据。
2. 逻辑上的潜在缺陷
当前的检查条件Paths.Skip(i).Any(x => x.Item1.Contains(Paths[i].Item1))在你的测试案例中看似能工作,但存在两个隐患:
Contains方法的误判风险:如果存在类似"1->20"这样的路径,它会错误地被判定为包含"1->2",但这显然不属于同一组路径,不符合你的需求。- 检查范围不严谨:
Skip(i)只检查当前元素之后的项,虽然你的输入是按路径长度递增排序的,但逻辑上没有覆盖所有可能的情况,不够健壮。
修正后的代码
我们调整代码解决类型问题,同时优化匹配逻辑(用前缀检查代替简单包含,更贴合路径的有序特性):
public class Program { public static void Main(string[] args) { List<(string Path, int Index)> flattenedPaths = new List<(string, int)> { ("1->2", 0), ("1->2->3", 1), ("1->2->3->4", 2), ("5->6", 3), ("5->6->7", 4), ("5->6->7->8", 5) }; // 类型匹配后,直接获取结果并输出 IEnumerable<string> uniquePaths = GetUniquePaths(flattenedPaths); foreach (var path in uniquePaths) { Console.WriteLine(path); } } public static IEnumerable<string> GetUniquePaths(List<(string Path, int Index)> paths) { foreach (var currentPath in paths) { // 检查是否存在更长的同组路径(当前路径是其前缀) bool hasLongerMatchingPath = paths.Any(other => other != currentPath && other.Path.StartsWith(currentPath.Path + "->")); // 没有更长匹配路径时,保留当前路径 if (!hasLongerMatchingPath) { yield return currentPath.Path; } } } }
代码说明
- 类型修正:
GetUniquePaths现在直接返回IEnumerable<string>,和Main中的变量类型完全匹配,避免了类型转换错误。 - 前缀检查优化:使用
StartsWith(currentPath.Path + "->")确保只有真正的后续路径(比如"1->2->3"是"1->2"的延伸)才会被判定为包含,彻底避免了Contains的误判情况。 - 逻辑简化:用foreach循环替代for循环,代码可读性更强,同时覆盖了所有路径的检查范围。
运行这段代码后,你会得到预期的输出:
1->2->3->4 5->6->7->8
内容的提问来源于stack exchange,提问作者Kunal Mukherjee
相关产品推荐
相关产品推荐

