📢 Webサイト閉鎖と移転のお知らせ
このWebサイトは2026年9月に閉鎖いたします。
新しい記事は移転先で追加しております。(旧サイトでは記事を追加しておりません)
編集の要約なし |
|||
| (2人の利用者による、間の10版が非表示) | |||
| 2行目: | 2行目: | ||
C#のLINQを種類ごとにまとめて、簡単なサンプルを記述する。<br> | C#のLINQを種類ごとにまとめて、簡単なサンプルを記述する。<br> | ||
<br> | <br> | ||
ここでは、結果の表示において、独自の拡張メソッドToResult(this IEnumerable)を使用している。<br> | |||
このメソッドを以下に記述する。<br> | |||
< | <syntaxhighlight lang="c#"> | ||
// 結果表示用の拡張メソッド | |||
public static String ToResult<TSource>(this IEnumerable<TSource> source) | |||
{ | |||
return "{" + string.Join(", ", source) + "}"; | |||
} | |||
public static String ToResult<TKey, TSource>(this IEnumerable<IGrouping<TKey, TSource>> source) | |||
{ | |||
return source.Select(group => string.Format("Key={0}, Source={1}", group.Key, group.ToResult())).ToResult(); | |||
} | |||
</syntaxhighlight> | |||
< | |||
{ | |||
</ | |||
<br><br> | <br><br> | ||
== ソート == | == ソート == | ||
<center> | <center> | ||
{| class="wikitable" | {| class="wikitable" | style="background-color:#fefefe;" | ||
|- | |- | ||
! メソッド名 ! | ! style="background-color:#66CCFF;" | メソッド名 | ||
! style="background-color:#66CCFF;" | 機能 | |||
|- | |- | ||
| OrderBy || 昇順にソートしたシーケンスを返す。 | | OrderBy || 昇順にソートしたシーケンスを返す。 | ||
| 159行目: | 36行目: | ||
|} | |} | ||
</center> | </center> | ||
< | <syntaxhighlight lang="c#"> | ||
var source = new[] { | var source = new[] { | ||
new{Name = "C#", Age = 11}, | new{Name = "C#", Age = 11}, | ||
| 196行目: | 73行目: | ||
// { Name = Java, Age = 16}, | // { Name = Java, Age = 16}, | ||
// { Name = C#, Age = 11 }} | // { Name = C#, Age = 11 }} | ||
</ | </syntaxhighlight> | ||
<br><br> | <br><br> | ||
== 射影 == | |||
<center> | <center> | ||
{| class="wikitable" | {| class="wikitable" | style="background-color:#fefefe;" | ||
|- | |- | ||
! メソッド名 ! | ! style="background-color:#66CCFF;" | メソッド名 | ||
! style="background-color:#66CCFF;" | 機能 | |||
|- | |- | ||
| Select || 1つの要素を単一の要素に射影する。 | | Select || 1つの要素を単一の要素に射影する。 | ||
| 211行目: | 90行目: | ||
|} | |} | ||
</center> | </center> | ||
< | <syntaxhighlight lang="c#"> | ||
var source = new[] { | var source = new[] { | ||
new{Name = "C#", Age = 11}, | new{Name = "C#", Age = 11}, | ||
| 229行目: | 108行目: | ||
// Key=16, Source={{ Name = Java, Age = 16 }}, | // Key=16, Source={{ Name = Java, Age = 16 }}, | ||
// Key=8, Source={{ Name = Groovy, Age = 8 }, { Name = Scala, Age = 8 }}} | // Key=8, Source={{ Name = Groovy, Age = 8 }, { Name = Scala, Age = 8 }}} | ||
</ | </syntaxhighlight> | ||
<br><br> | |||
== 結合 == | |||
<center> | |||
{| class="wikitable" | style="background-color:#fefefe;" | |||
|- | |||
! style="background-color:#66CCFF;" | メソッド名 | |||
! style="background-color:#66CCFF;" | 機能 | |||
|- | |||
| Join || 内部結合を行ったシーケンスを返す。 | |||
|- | |||
| GroupJoin || 左外部結合を行って指定のキーでグループ化する。その "キーとグループ" のシーケンスを返す。 | |||
|- | |||
| Concat || 2つのシーケンスを連結する。(Unionは同じ要素を一つにまとめるが、Concatは元の要素をすべて返す) | |||
|- | |||
| DefaultIfEmpty || シーケンスを返す。シーケンスが空なら、規定値もしくは任意の要素を返す。 | |||
|- | |||
| Zip || 指定した関数で、2つのシーケンスを1つのシーケンスにマージする。 | |||
|} | |||
</center> | |||
<syntaxhighlight lang="c#"> | |||
var outer = new[] { | |||
new{Name = "C#", Age = 11}, | |||
new{Name = "Java", Age = 16}, | |||
new{Name = "Groovy", Age = 8}, | |||
new{Name = "Scala", Age = 8}, | |||
}; | |||
var outer2 = new[] { | |||
new{Name = "Python", Age = 21}, | |||
new{Name = "COBOL", Age = 52}, | |||
}; | |||
var inner = new[] { | |||
new{Name = "C#", DesignedBy = "Microsoft"}, | |||
new{Name = "Java", DesignedBy = "Sun Microsystems"}, | |||
new{Name = "Java", DesignedBy = "Oracle"}, | |||
}; | |||
Console.WriteLine(outer.Join(inner, o => o.Name, i => i.Name, (o, i) => new { o.Name, o.Age, i.DesignedBy}).ToResult()); | |||
// → {{ Name = C#, Age = 11, DesignedBy = Microsoft }, | |||
// { Name = Java, Age = 16, DesignedBy = Sun Microsystems }, | |||
// { Name = Java, Age = 16, DesignedBy = Oracle }} | |||
Console.WriteLine(outer.GroupJoin(inner, o => o.Name, i => i.Name, (o, i) => | |||
new { o.Name, o.Age, DesigndBy = i.Select(e => e.DesignedBy).ToResult() }).ToResult()); | |||
// → {{ Name = C#, Age = 11, DesigndBy = {Microsoft} }, | |||
// { Name = Java, Age = 16, DesigndBy = {Sun Microsystems, Oracle} }, | |||
// { Name = Groovy, Age = 8, DesigndBy = {} }, | |||
// { Name = Scala, Age = 8, DesigndBy = {} }} | |||
Console.WriteLine(outer.Concat(outer2).ToResult()); | |||
// → {{ Name = C#, Age = 11 }, | |||
// { Name = Java, Age = 16 }, | |||
// { Name = Groovy, Age = 8 }, | |||
// { Name = Scala, Age = 8 }, | |||
// { Name = Python, Age = 21 }, | |||
// { Name = COBOL, Age = 52 }} | |||
Console.WriteLine(outer.DefaultIfEmpty().ToResult()); | |||
// → {{ Name = C#, Age = 11 }, | |||
// { Name = Java, Age = 16 }, | |||
// { Name = Groovy, Age = 8 }, | |||
// { Name = Scala, Age = 8 }} | |||
Console.WriteLine(outer.Zip(outer2, (o1, o2) => o1.Name + "&" + o2.Name).ToResult()); | |||
// → {C#&Python, Java&COBOL} | |||
</syntaxhighlight> | |||
<br><br> | |||
== 変換 == | |||
<center> | |||
{| class="wikitable" | style="background-color:#fefefe;" | |||
|- | |||
! style="background-color:#66CCFF;" | メソッド名 | |||
! style="background-color:#66CCFF;" | 機能 | |||
|- | |||
| OfType || 各要素を指定した型に変換する。<br>キャストできない要素は除外する。 | |||
|- | |||
| Cast || 各要素を指定した型に変換する。<br>キャストできない要素が含まれていた場合、例外をスローする。 | |||
|- | |||
| ToArray || 配列を作成する。 | |||
|- | |||
| ToDictionary || 連想配列(ディクショナリ)を作成する。 | |||
|- | |||
| ToList ||リストを作成する。 | |||
|- | |||
| ToLookup || キーコレクション*1を生成する。<br>IEnumerableと同じ名前のメソッドがクラス内に定義されている場合に使用する。<br>そのままだと、クラス内のメソッドが優先的に選択されて、<br>IEnumerableの拡張メソッドが呼びだせないためである。 | |||
|- | |||
| AsEnumerable || IEnumerableを返す。<br>1対多のディクショナリである。<br>例えば、〜.ToLookup()["hoge"]と実行すると、hogeに紐付く要素の集合(IEnumerable)が返る。 | |||
|} | |||
</center> | |||
<br> | |||
<syntaxhighlight lang="c#"> | |||
ArrayList mixed = new ArrayList { "C#", "Java", 3.141592653, "Groovy", "Scala" }; | |||
Console.WriteLine(mixed.OfType<string>().ToResult()); | |||
// → {C#, Java, Groovy, Scala} | |||
Console.WriteLine(mixed.Cast<string>().ToResult()); | |||
// → System.InvalidCastException: | |||
// 型 'System.Double' のオブジェクトを型 'System.String' にキャストできません。 | |||
</syntaxhighlight> | |||
<br><br> | <br><br> | ||
__FORCETOC__ | __FORCETOC__ | ||
[[カテゴリ:C_Sharp]] | [[カテゴリ:C_Sharp]] | ||