C# 如何检查列表是否包含顺序相同的其他列表
在c中有没有简单的方法来检查列表是否由另一个列表组成?。 举个例子, 我有:C# 如何检查列表是否包含顺序相同的其他列表,c#,list,C#,List,在c中有没有简单的方法来检查列表是否由另一个列表组成?。 举个例子, 我有: var list1=newlist(){1,2,3,4,5,6,} 第二个呢 var list2=newlist(){5,6} 此列表是第一个列表的一部分,因此它应该返回true var list1=newlist(){1,2,3,4,5,6,} 及 var list3=newlist(){1,3}应返回false 这不是关于检查第一个列表中的所有元素是否都存在于第二个列表中,而是关于顺序。它必须有相同的顺序。这对我来
var list1=newlist(){1,2,3,4,5,6,}代码>
第二个呢
var list2=newlist(){5,6}代码>
此列表是第一个列表的一部分,因此它应该返回true
var list1=newlist(){1,2,3,4,5,6,}代码>
及
var list3=newlist(){1,3}代码>应返回false
这不是关于检查第一个列表中的所有元素是否都存在于第二个列表中,而是关于顺序。它必须有相同的顺序。这对我来说很有用:
public bool ContainsSubsequence<T>(List<T> sequence, List<T> subsequence)
{
return
Enumerable
.Range(0, sequence.Count - subsequence.Count + 1)
.Any(n => sequence.Skip(n).Take(subsequence.Count).SequenceEqual(subsequence));
}
我得到:
True
False
感谢@geogevos&@Enigmativity指出第一个解决方案中的问题
public static bool HasSubSequence(List<int> main, List<int> query)
{
var startIndex = main.IndexOf(query.First());
if (main == null || query == null || startIndex < 0)
return false;
while (startIndex >= 0)
{
if (main.Count - startIndex < query.Count)
return false;
var nonMatch = false;
for (int i = 0; i < query.Count; i++)
{
if (main[i + startIndex] != query[i])
{
main = main.Skip(startIndex + 1).ToList();
startIndex = main.IndexOf(query.First());
nonMatch = true;
break;
}
}
if (!nonMatch)
return true;
}
return false;
}
publicstaticboolhassubsequence(列表主目录,列表查询)
{
var startIndex=main.IndexOf(query.First());
if(main==null | | query==null | | startIndex<0)
返回false;
而(startIndex>=0)
{
if(main.Count-startIndex
范例
var l1 = new List<int> { 1, 2, 3, 4, 5 };
var l2 = new List<int> { 4, 5 };
var l3 = new List<int> { 1, 3 };
var l4 = new List<int> { 5, 6 };
var l5 = new List<int> { 1, 2, 3, 2, 5, 6, 2, 4, 8 };
var l6 = new List<int> { 2, 4 };
var test1 = HasSubSequence(l1, l2); //true
var test2 = HasSubSequence(l1, l3); //false
var test3 = HasSubSequence(l1, l4); //false
var test5 = HasSubSequence(l5, l6); //true
var l1=新列表{1,2,3,4,5};
var l2=新列表{4,5};
var l3=新列表{1,3};
var l4=新列表{5,6};
var l5=新列表{1,2,3,2,5,6,2,4,8};
var l6=新列表{2,4};
var test1=HasSubSequence(l1,l2)//真的
var test2=HasSubSequence(l1,l3)//假的
var test3=HasSubSequence(l1,l4)//假的
var test5=HasSubSequence(l5,l6)//真的
您想要一个通用解决方案还是只针对整数列表?您尝试了什么?你写了什么代码?你做了什么研究?你的意思是包含另一个相同顺序的列表吗?如果你的问题包含有效的代码,我会很好。是的,现在我需要它只是为了intigers。目前,我正试图找到是否已经有任何现有的解决方案,这个问题。是的,顺序很重要。元素的顺序很重要。您需要用while循环(并稍微修改indexof)来包装代码,因为第二个列表的第一个元素可能在此之前就存在。如果query.first()
出现在子序列之前的main
中,那么这仍然不起作用。事实上,for循环也必须更改。列表my不会出现在startWithvar list3=new list(){1,2,}
它应该返回true
,但它返回false
@user2946329-我确实在代码中有一个错误,但我修复了它<代码>{1,2}
现在可以正常工作了。@Enigmativity。。对现在它成为了一个好的、全面的解决方案+1.我对此进行了少量测试,如果sequence.Count小于subsequence.Count,它会抛出一个异常。因此,在这个方法的开头添加“if”条件是非常必要的。@wgrzesiak147-是的,这很公平。我写代码是为了简洁,而不是健壮。我通常认为,如果代码保持尽可能简单,就很容易看到它的意图。但我相信大多数程序员都会理解加强代码的必要性。
var l1 = new List<int> { 1, 2, 3, 4, 5 };
var l2 = new List<int> { 4, 5 };
var l3 = new List<int> { 1, 3 };
var l4 = new List<int> { 5, 6 };
var l5 = new List<int> { 1, 2, 3, 2, 5, 6, 2, 4, 8 };
var l6 = new List<int> { 2, 4 };
var test1 = HasSubSequence(l1, l2); //true
var test2 = HasSubSequence(l1, l3); //false
var test3 = HasSubSequence(l1, l4); //false
var test5 = HasSubSequence(l5, l6); //true