如果我的列表为:我正在尝试在字符串列表中找到最长的字符串匹配项。
- "1->2"
- "1->2->3"
- "1->2->3->4"
- "5->6"
- "5->6->7"
- "5->6->7->8"
所以输出应该是因为此字符串包含同一列表中的所有匹配项,所以我想丢弃其余不足的匹配项:
"1->2->3->4"
"5->6->7->8"
更新:
1->2
中包含1->2->3
和1->2->3->4
,所以我想舍弃诸如1->2
和1->2->3
这样不太具体的那些,并采用最长的匹配1->2->3->4
路径将始终像1->2->3->4
那样排列,而不是1->4
或1->3
。
我正在尝试这样,但是我得到了enumeration yielded no results
:
public class Program
{
public static void Main(string[] args)
{
List<(string, i)> flattenedPaths = new List<(string, i)>
{
("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);
}
public static IEnumerable<(string, int)> GetUniquePaths(List<(string, int)> Paths)
{
for (int i = 0; i < Paths.Count; i++)
{
bool doesMatchContain = Paths.Skip(i)
.Any(x => x.Item1.Contains(Paths[i].Item1));
if (!doesMatchContain)
yield return Paths[i];
}
}
}
感谢您的帮助。
答案 0 :(得分:1)
以下是您不妨尝试的一种方法。
betterData
是您的现有数据,但预计会以更有用的形式显示-范围的上限和下限是整数而不是字符串。
Substring
和IndexOf
和LastIndexOf
代码很脆弱-但适用于您当前的样本数据-随时检查{{1} }等。
一旦我们有了一个设置了上限和下限的数据列表,我们就使用-1
从列表中删除所有在范围内(例如2)的条目-3是在之内1-4)。
还请注意,RemoveAll
用于允许我们在修改列表的同时修改。有一些更奇妙的方法可以达到相同的效果-但是它们更容易出错,因此我在这里使用了笨拙但简单的方法。
betterData.ToList()
答案 1 :(得分:1)
请您尝试以下查询
<iostream>
答案 2 :(得分:-1)
如果输入正确,并且您想查找包含该字符串的最长序列,请遵循以下代码,
/^[\w\-:]+$/