9

あるタイプのオブジェクトのコレクションを別のタイプに変換したいと考えています。これは foreach で簡単にできますが、Linq の集計関数を使ってそれを行う方法を見つけたいと思います。

問題は、すべての Aggregate の例で、「+」演算子をサポートする line string または int 型が使用されていることです。アキュムレータの型をリストにしたいのですが、これは「+」セマンティクスをサポートしていません。

簡単な例を次に示します。

public class DestinationType
{
    public DestinationType(int A, int B, int C) { ... }
}

var set = from item in context.Items
          select new { item.A, item.B, item.C };

var newSet = set.Aggregate( new List<DestinationType>(),
                            (list, item) => list.Add(new DestinationType(item.A, item.B, item.C)) );

問題は、List<>.Add が void を返すことです。Aggregate の 2 番目のパラメーターの戻り値の型は、リストである必要があります。

「+」型セマンティクスをサポートするリスト型があれば、2 番目のパラメーターを作成できます。

list + item

ただし、この種のことをサポートするコレクション型は見つかりません。

これはLinqで簡単にできるようです。方法はありますか?また、完全に簡単な方法を見逃している場合は、それについても知りたいです。ありがとう!

4

5 に答える 5

29

これがLINQ to Objectsであると仮定して、試してください...

var newSet = set.Aggregate(new List<DestinationType>(),
                                    (list, item) =>
                                    {
                                        list.Add(new DestinationType(item.A, item.B, item.C));
                                        return list;
                                    });
于 2009-06-13T17:02:49.613 に答える
10

ToList()と組み合わせたSelectの呼び出しが、ここで必要なものかもしれないと思います。例えば:

context.Items
  .Select(item => new DestinationType(item.A, item.B, item.C))
  .ToList();
于 2009-06-13T16:56:31.657 に答える
4

こちらからお申し込みselectいただけます。

var newSet = set.Select(item => new DestinationType(...)).ToList();

Aggregate(一般にfoldまたはとして知られている) は、各要素に機能を適用する要素を結合reduceするために使用されます。select

元:

fを単項関数にすると、 equalsになります。[a, b, c].select(f)[f(a), f(b), f(c)]

fを 2 項関数にすると、次のようになります。[a, b, c].aggregate(f, init)f(a, f(b, f(c, init)))

例で選択した方法は C# では一般的ではありませんが、既存のコレクションを変更する代わりに (リンクされた) リストが新しいリストに変換される関数型プログラミングでよく使用されます。

reversed = fold (\list element -> element:list) [] [1..10]

本当にこの計算を で行いたい場合はaggregate、Dustin のソリューションを使用するか、不変コレクションにリンク リスト ベースの型を実装することをお勧めします (この型に を与えることもできますoperator +)。

于 2009-06-13T17:07:14.703 に答える
1

私が明白な何かを見逃していない限り、なぜそれをしないのですか?

public class DestinationType
{
    public DestinationType(int A, int B, int C) { ... }
}

var newSet = from item in context.Items
    select new DestinationType(item.A, item.B, item.C);
于 2011-02-21T11:40:57.560 に答える