以下のようなリストがあります。
リスト
- 3 ジョン
- 1 スカリー
- 4 エドワード
- 9 キム
これをlinqで変換しようとしています。
リスト
- 3 ジョン
- 4 スカリー
- 8 エドワード
- 17 キム
forループなしでそれを行うにはどうすればよいですか。これをlinqで実現したい。
LINQ でこれを行う方法はまだありません。自分で書く必要があります。次のようなことを試してください:
using System;
using System.Collections.Generic;
static class MyExtensions
{
public static IEnumerable<TResult> AggregatingSelect<TItem, TAggregate, TResult>(
this IEnumerable<TItem> items,
Func<TItem, TAggregate, TAggregate> aggregator,
TAggregate initial,
Func<TItem, TAggregate, TResult> projection)
{
TAggregate aggregate = initial;
foreach (TItem item in items)
{
aggregate = aggregator(item, aggregate);
yield return projection(item, aggregate);
}
}
}
class Program
{
static void Main(string[] args)
{
var numbers = new[] { 3, 1, 4, 9 };
var result = numbers.AggregatingSelect(
(int item, int agg) => item + agg,
0,
(int item, int agg) => agg);
Console.WriteLine(string.Join(",", result));
}
}
古典的な for ループでそれを行うだけです。よりシンプルで、理解しやすく、保守しやすく、効率的です。
LINQ は基本的に、特定のリストの以前の順序付けされた値に応じてアイテムを更新するようには設計されていません。