c#中是否有任何简单的方法来检查列表是否包含另一个列表? 这是一个例子, 我有:
var list1 = new List<int>() {1, 2, 3, 4, 5, 6,};
第二个
var list2 = new List<int>() {5, 6};
此列表是第一个列表的一部分,因此它应该返回true。
var list1 = new List<int>() {1, 2, 3, 4, 5, 6,};
和
var list3 = new List<int>() {1, 3};
应该返回false。
它不是要检查第一个列表中的所有元素是否都存在于第二个列表中,而是关于订单。它必须具有相同的顺序。
答案 0 :(得分:12)
这对我有用:
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));
}
此代码使用Enumerable.Range
遍历sequence
中可能与subsequence
相同的每个可能起点,并检查sequence
的段是否相同这个位置的subsequence
实际上等于subsequence
。
所以对于这段代码:
var list1 = new List<int>() { 1, 2, 3, 4, 5, 6, };
var list2 = new List<int>() { 5, 6, };
var list3 = new List<int>() { 1, 3, };
Console.WriteLine(ContainsSubsequence(list1, list2));
Console.WriteLine(ContainsSubsequence(list1, list3));
我明白了:
True
False
答案 1 :(得分:2)
谢谢@GeorgeVovos&amp; @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;
}
实施例
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