У меня есть список А, содержащий {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?
У меня есть список А, содержащий {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?
Ну, простой перевод:
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]);
Итак, получив следующий элемент в списке, который вы можете использовать:
A.SkipWhile(x => x != value).Skip(1).FirstOrDefault();
Итак, чтобы использовать предыдущий элемент:
var B = A.ToList();
B.Reverse();
B.SkipWhile(x => x != value).Skip(1).FirstOrDefault();
Как насчет чего-то вроде
var l = A.Skip(1).Select((x, index) => x + A[index]).ToList();
Некоторые из других ответов предполагают, что элементы 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 для этого.
Если вам нужно только конечное значение, вы можете скомпилировать его, т.е. вам нужно предыдущее значение, но не нужно каждое отдельное значение для нового списка.
int last = 0;
var r = m.Aggregate(last, (acc, it) => (last += it), (acc) => (last));