リストに別のリスト(順序を保持)が含まれているかどうかを確認するための効率的で簡単な方法を見つけるのに苦労しています。これはstring.Contains(string)機能に類似しています。
私がintの4つのコレクションを持っているとしましょう:
A = [1, 2, 3, 4, 5]
B = [2, 3]
C = [5, 6, 7]
D = [3, 2, 4]
A.Contains(B)
は真ですが、A.Contains(C)
とA.Contains(D)
は偽です。
助けることができればイテレータを使用したくないのですが、それを行うための効率的な方法を想像することはできません。次のコードは非常に非効率的です。
public static bool IsSequentiallyEqual<T>(this IEnumerable<T> lhs, IEnumerable<T> rhs)
{
return lhs.Zip(rhs, (a, b) => a.Equals(b)).All(isEqual => isEqual == true);
}
public static bool StartsWith<T>(this IEnumerable<T> haystack, IEnumerable<T> needle)
{
return haystack.Take(needle.Count()).IsSequentiallyEqual(needle);
}
public static bool Contains<T>(this IEnumerable<T> haystack, IEnumerable<T> needle)
{
var result = list.SkipWhile((ele, index) => haystack.Skip(index).StartsWith(needle));
return result.Count() >= needle.Count();
}