entiendo que esto es una cuestión de edad, pero necesitaba este método exacto y lo he escrito arriba, así:
public static int ContainsSubsequence<T>(this IEnumerable<T> elements, IEnumerable<T> subSequence) where T: IEquatable<T>
{
return ContainsSubsequence(elements, 0, subSequence);
}
private static int ContainsSubsequence<T>(IEnumerable<T> elements, int index, IEnumerable<T> subSequence) where T: IEquatable<T>
{
// Do we have any elements left?
bool elementsLeft = elements.Any();
// Do we have any of the sub-sequence left?
bool sequenceLeft = subSequence.Any();
// No elements but sub-sequence not fully matched
if (!elementsLeft && sequenceLeft)
return -1; // Nope, didn't match
// No elements of sub-sequence, which means even if there are
// more elements, we matched the sub-sequence fully
if (!sequenceLeft)
return index - subSequence.Count(); // Matched!
// If we didn't reach a terminal condition,
// check the first element of the sub-sequence against the first element
if (subSequence.First().Equals(e.First()))
// Yes, it matched - move onto the next. Consume (skip) one element in each
return ContainsSubsequence(elements.Skip(1), index + 1 subSequence.Skip(1));
else
// No, it didn't match. Try the next element, without consuming an element
// from the sub-sequence
return ContainsSubsequence(elements.Skip(1), index + 1, subSequence);
}
Actualizado a no sólo la devolución si la sub-secuencia igualada, pero donde se inició en la secuencia original.
Este es un método de extensión en IEnumerable, completamente vago, termina antes de tiempo y está mucho más modificado que la respuesta actualmente votada. Advertido, sin embargo (como señala @ wai-ha-lee) es recursivo y crea un lote de enumeradores. Úselo cuando corresponda (rendimiento/memoria). Esto estuvo bien para mis necesidades, pero YMMV.
¿Qué tan grande es largeSequence? ¿Y esto es para uso práctico o conceptual? Porque puedo pensar en un par de formas que estarían bien en un registro relativamente pequeño (unos pocos miles), pero que no serían necesariamente bellas ni funcionarían en entornos más grandes. –
Preferiría algo que escalara bien con secuencias grandes. La aplicación real es pequeña (solo unos pocos cientos de elementos), sin embargo, entrará en nuestra clase de utilidad, por lo que podría usarse para secuencias mucho más grandes en el futuro. – trampster
¿Qué esperas que encuentre FindSequence? ¿Un índice? ¿Verdadero Falso? La subsecuencia? ¿Los elementos que deben coincidir deben estar en orden y adyacentes? –