GroupBy、Join、Aggregate、射影(匿名型)
項目をグループ化し、シーケンスを結合し、Aggregateで集約し、匿名型を使って整理された結果へ射影します。
「GroupBy、Join、Aggregate、射影(匿名型)」はCoddyKit上の無料C# Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC# Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C# Academyコースには全3レッスンが含まれています。
高度な演算子の概要
今日の内容:
- GroupBy: キーごとにバケットを作成
- Join: キーで2つのシーケンスを結合
- Aggregate: 1つの値に集約
- 匿名型: 整った射影を作成
キーによるグループ化
GroupByは、Keyと、そのキーを共有する項目の内部シーケンスを持つグループを作成します。
using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
string[] words = new string[] { "ant", "cat", "tiger", "lion", "dog", "eagle" };
var groups = words.GroupBy(w => w.Length);
foreach (var g in groups)
{
Console.WriteLine("Len " + g.Key + ":");
foreach (string w in g) Console.WriteLine(" - " + w);
}
}
}
キーによる内部結合
Joinは、キーによって2つのシーケンスの項目を対応付け、結合した結果を射影します。
using System;
using System.Linq;
public sealed class Customer { public int Id; public string Name; public Customer(int id, string name){ Id=id; Name=name; } }
public sealed class Order { public int CustomerId; public string Item; public Order(int cid, string item){ CustomerId=cid; Item=item; } }
public class Program
{
public static void Main(string[] args)
{
var customers = new Customer[] { new Customer(1,"Ada"), new Customer(2,"Bob") };
var orders = new Order[] { new Order(1,"Book"), new Order(1,"Pen"), new Order(2,"Map") };
var joined = customers.Join(
orders,
c => c.Id,
o => o.CustomerId,
(c, o) => c.Name + " -> " + o.Item);
foreach (string s in joined) Console.WriteLine(s);
}
}
Aggregateの基本
Aggregateはアキュムレーターを適用し、シーケンスを1つの結果に縮約します。適切な初期値を選びます。
using System;
using System.Linq;
public class Program
{
public static void Main(string[] args)
{
int[] xs = new int[] { 1, 2, 3, 4 };
// Product with seed 1
int product = xs.Aggregate(1, (acc, n) => acc * n);
Console.WriteLine("Product = " + product); // 24
// Join words with a separator using seed
string[] words = new string[] { "a", "b", "c" };
string csv = words.Aggregate("", (acc, w) => acc == "" ? w : acc + "," + w);
Console.WriteLine(csv); // a,b,c
}
}
匿名型による射影
整った射影には匿名型を使います: new { Name = c.Name, ... } または省略形の new { c.Name }。
using System;
using System.Linq;
public sealed class City { public string Name; public int Pop; public City(string n,int p){ Name=n; Pop=p; } }
public class Program
{
public static void Main(string[] args)
{
var cities = new City[]
{
new City("Oslo", 634000),
new City("Rome", 2873000),
new City("Riga", 605000)
};
var small = cities
.Where(c => c.Pop < 1000000)
.Select(c => new { c.Name, Millions = (c.Pop / 1000000.0) });
foreach (var x in small)
{
Console.WriteLine(x.Name + " ~ " + x.Millions + "M");
}
}
}
実践的なヒント
ヒント:
- GroupByの後は、グループを反復し、続けて項目を反復します。
- 一致するキーを持つ2つのソースがある場合はJoinを使います。
- Aggregateには、意味のある初期値を選びます。
- 匿名型はローカルな用途に限定されます。公開APIからは具象DTOを返します。
GroupByの目的
要約
要約: バケットの作成にはGroupBy、ソースの結合にはJoin、縮約にはAggregate、整った射影には匿名型を使います。
よくある質問
「GroupBy、Join、Aggregate、射影(匿名型)」レッスンは無料ですか?
はい。「GroupBy、Join、Aggregate、射影(匿名型)」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C# Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C# Academyコースには全3レッスンが含まれています。
「GroupBy、Join、Aggregate、射影(匿名型)」で何を学びますか?
項目をグループ化し、シーケンスを結合し、Aggregateで集約し、匿名型を使って整理された結果へ射影します。 ブラウザで直接実行するハンズオンコードでC# Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C# Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC# Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。
「GroupBy、Join、Aggregate、射影(匿名型)」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC# Academyレッスンでコードを書いて実行できますか?
はい。すべてのC# Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- GroupBy、Join、Aggregate、射影(匿名型)
- 具体化(ToList、ToDictionary)とパフォーマンスの注意点
- 合成可能にするためのヒント