c# - mvc - linq to sql
Linq forma de obtener la diferencia por partes entre el elemento y el siguiente elemento en la lista (2)
Si está utilizando .NET 4, entonces podría Zip
y Skip
:
var differences = myList.Zip(myList.Skip(1), (x, y) => y - x);
Si está utilizando una versión anterior del marco, y / o deseaba una forma un poco más eficiente de hacerlo, podría crear un método de extensión simple:
var differences = myList.Pairwise((x, y) => y - x);
// ...
public static class EnumerableExtensions
{
public static IEnumerable<T> Pairwise<T>(
this IEnumerable<T> source, Func<T, T, T> selector)
{
if (source == null) throw new ArgumentNullException("source");
if (selector == null) throw new ArgumentNullException("selector");
using (var e = source.GetEnumerator())
{
if (!e.MoveNext()) throw new InvalidOperationException("Sequence cannot be empty.");
T prev = e.Current;
if (!e.MoveNext()) throw new InvalidOperationException("Sequence must contain at least two elements.");
do
{
yield return selector(prev, e.Current);
prev = e.Current;
} while (e.MoveNext());
}
}
}
¿Hay una forma Linq de saber cuál es el siguiente elemento en la secuencia mientras se itera? Como ejemplo concreto, digamos que tengo una lista de caracteres y quiero calcular la diferencia entre cada elemento y su sucesor, por ejemplo, me gustaría poder escribir
var myList = new List<int>() { 1,3,8,2,10 };
var differences = myList.Select( ml => ml.Next() - ml ) // pseudo-code, obviously
donde el resultado que quiero es una lista {2,5, -6,8}.
Obviamente, esto es trivial en un bucle for, pero ¿alguien puede pensar en una buena línea en Linq para hacer este trabajo?
var differences = myList
.Take(myList.Count - 1)
.Select((v, i) => myList[i + 1] - v);
Suponiendo que la lista tiene al menos 2 elementos.