Подтвердить что ты не робот

Как получить доступ к предыдущему элементу в списке с помощью linQ?

У меня есть список А, содержащий {1,2,3,4,5,6}

List<int> m=new List<int>();
for(int i=1;i<A.count;i++)
{
int j=A[i]+A[i-1];
m.add(j);
}

как я могу выполнить эту же операцию с помощью LinQ?

4b9b3361

Ответ 1

Ну, простой перевод:

var m = Enumerable.Range(1, A.Count - 1)
                  .Select(i => A[i] + A[i - 1])
                  .ToList();

Но также рассмотрим:

var m = A.Skip(1)
         .Zip(A, (curr, prev) => curr + prev)
         .ToList();

Или используя расширение Jon Skeet здесь:

var m = A.SelectWithPrevious((prev, curr) => prev + curr)
         .ToList();

Но, как указывает Джейсон Эванс в комментарии, это не очень помогает с удобочитаемостью или кратностью, учитывая, что ваш существующий код совершенно понятен (и коротким), и вы хотите материализовать все результаты в список в любом случае.

Нет ничего плохого в:

var sumsOfConsecutives = new List<int>();

for(int i = 1; i < A.Count; i++)
   sumsOfConsecutives.Add(A[i] + A[i - 1]);

Ответ 2

Итак, получив следующий элемент в списке, который вы можете использовать:

A.SkipWhile(x => x != value).Skip(1).FirstOrDefault();

Итак, чтобы использовать предыдущий элемент:

var B = A.ToList();
B.Reverse();
B.SkipWhile(x => x != value).Skip(1).FirstOrDefault();

Ответ 3

Как насчет чего-то вроде

var l = A.Skip(1).Select((x, index) => x + A[index]).ToList();

Ответ 4

Некоторые из других ответов предполагают, что элементы A всегда будут 1, 2, 3, 4, 5, 6. Если эти значения когда-либо изменятся, тогда решение сломается, например, значения, меняющиеся на 2, 3, 6, 7, 10.

Здесь мое решение, которое будет работать с любыми значениями A.

List<int> m = A.Skip(1).Select((element, index) => element + A.ElementAt(index)).ToList();

Стоит отметить, что придерживаться петли, вероятно, будет лучше, чем взломать решение Linq для этого.

Ответ 5

Если вам нужно только конечное значение, вы можете скомпилировать его, т.е. вам нужно предыдущее значение, но не нужно каждое отдельное значение для нового списка.

int last = 0;
var r = m.Aggregate(last, (acc, it) => (last += it), (acc) => (last));