I obtuve un poco de inspiración y pensé en una solución con solo la velocidad en mente. Esto realmente no es tan fácil de leer (que generalmente prefiero), pero las características cuando se trata de velocidad deberían ser bastante buenas.
El peor caso es el mismo para la mayoría de las otras implementaciones O (n), pero es muy poco probable, ya que requeriría toda la primera mitad de los elementos a ser igual y el segundo medio a ser todos iguales, pero no igual al valor en la primera mitad. y requeriría el mismo número de comparaciones que una búsqueda lineal. En la mayoría de los otros casos con el primero impar en un lugar aleatorio, esto requerirá la mitad de comparaciones que el lineal. En el caso donde los valores están en pares. Entonces ese artículo [0] == artículo [1] y artículo [2] == artículo [3] y artículo [0]! = Artículo [2] (y similar) entonces la búsqueda lineal será más rápida. En general, ya sea con datos aleatorios o unos pocos extraño una vez que esta debe ser más rápido que una búsqueda lineal
public static bool AllSame<T>(this IEnumerable<T> source,
IEqualityComparer<T> comparer = null)
{
if (source == null)
throw new ArgumentNullException("source cannot be null.", "source");
if (comparer == null)
comparer = EqualityComparer<T>.Default;
var enumerator = source.GetEnumerator();
return source.Zip(comparer);
}
private static bool Zip<T>(this IEnumerable<T> sequence, IEqualityComparer<T> comparer)
{
var result = new List<T>();
var enumerator = sequence.GetEnumerator();
while (enumerator.MoveNext())
{
var first = enumerator.Current;
result.Add(enumerator.Current);
if (enumerator.MoveNext())
{
if (!comparer.Equals(first, enumerator.Current))
{
return false;
}
}
else
{
break;
}
}
return result.Count == 1 ? true : result.Zip(comparer);
}
con fuera de optimización llamada de cola esta utiliza memoria adicional (con un peor caso de una cantidad de memoria cerca de la cantidad de memoria utilizada para la fuente original). La pila de llamadas no debería llegar a profundidad, ya que ninguna implementación concreta de IEnumerable (al menos que yo sepa) puede contener más que elementos int.MaxValue. lo que requeriría un máximo de 31 recursiones.
Lo que es usted es requisito importante es la lectura? es la velocidad importante? ¿Cuál es el escenario habitual? ¿Que son lo mismo o que no son lo mismo? –
Basado en la etiqueta #arrays que usted pone en esta pregunta, ¿podemos suponer que su objeto MeasurementCollection se almacena como una matriz o ArrayList? ¿Podemos obtener un '.Count' de una MeasurementCollection sin incurrir en demasiados gastos generales? La respuesta correcta dependerá de saber más sobre su colección subyacente. – StriplingWarrior
¿Por qué no desea agregar este método (con cualquier implementación) a MeasurementCollection? ¿Por qué usas el método de extensión para esto? Si esta funcionalidad es parte de esta abstracción en particular muéstrela explícitamente. –