Je ne suis pas sûr de savoir ce que vous voulez dire sur les bits négatifs, mais cela pourrait faire ce que vous voulez. Il est horrible, car il utilise des effets secondaires, mais ...
double prev = 0d;
var differences = list.Select(current =>
{
double diff = prev - current;
prev = current;
return Math.Abs(diff);
}).Skip(1);
(La première valeur est ignorée, car il donne juste la différence entre la première valeur d'origine et 0d.)
EDIT: Ce qui pourrait être légèrement plus agréable serait une méthode d'extension à projeter basée sur des paires d'éléments. Cela permet d'isoler les effets secondaires en un seul endroit, ce qui est bien:
using System.Collections.Generic;
// This must be a non-nested type, and must be static to allow the extension
// method.
public static class Extensions
{
public static IEnumerable<TResult> SelectPairs<TSource, TResult>
(this IEnumerable<TSource> source,
Func<TSource, TSource, TResult> selector)
{
using (IEnumerator<TSource> iterator = source.GetEnumerator())
{
if (!iterator.MoveNext())
{
yield break;
}
TSource prev = iterator.Current;
while (iterator.MoveNext())
{
TSource current = iterator.Current;
yield return selector(prev, current);
prev = current;
}
}
}
}
Pour utiliser dans votre cas particulier, vous feriez:
var differences = list.SelectPairs((x, y) => Math.Abs(x-y));
Pourquoi? Pourquoi le résoudre avec LINQ? Cela ne ressemble pas à un problème qui doit être résolu avec LINQ. –
Pourquoi 0,53 au lieu de 0,54 dans votre exemple? –