Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
Enumerable.ToList() / ToArray() / ToDictionary()
LINQ クエリの結果を具体的なコレクション型に変換する拡張メソッドです。遅延評価のシーケンスを実体化して再利用できる形にします。
構文
using System.Linq; // List<T> に変換します(追加・削除が可能)。 List<T> list = source.ToList(); // 配列に変換します(固定長)。 T[] array = source.ToArray(); // Dictionary<TKey, TValue> に変換します。 Dictionary<TKey, TValue> dict = source.ToDictionary(x => キー, x => 値); // HashSet<T> に変換します(重複を自動除去)。 HashSet<T> set = source.ToHashSet();
メソッド一覧
| メソッド | 概要 |
|---|---|
| ToList() | シーケンスを即時評価して『List<T>』を返します。 |
| ToArray() | シーケンスを即時評価して配列を返します。 |
| ToDictionary(keySelector) | キーセレクターで辞書を生成します。値は要素そのものです。 |
| ToDictionary(keySelector, elementSelector) | キーと値を別々に指定して辞書を生成します。 |
| ToHashSet() | 重複を自動除去した『HashSet<T>』を返します。 |
| ToLookup(keySelector) | 1 つのキーに複数の値を対応させた『Lookup』を返します(詳細は GroupBy を参照)。 |
サンプルコード
using System;
using System.Collections.Generic;
using System.Linq;
IEnumerable<int> source = Enumerable.Range(1, 5);
// ToList: List<T> に変換します。
List<int> list = source.ToList();
list.Add(6);
Console.WriteLine(string.Join(", ", list)); // 1, 2, 3, 4, 5, 6
// ToArray: 配列に変換します。
int[] array = source.ToArray();
Console.WriteLine(array.Length); // 5
// ToDictionary: ID をキーにして辞書を生成します。
var users = new List<(int Id, string Name)>
{
(1, "田中"),
(2, "鈴木"),
(3, "佐藤"),
};
Dictionary<int, string> dict = users.ToDictionary(u => u.Id, u => u.Name);
Console.WriteLine(dict[2]); // 鈴木
// ToHashSet: 重複を自動で除去します。
List<int> withDups = new List<int> { 1, 2, 2, 3, 3, 3 };
HashSet<int> set = withDups.ToHashSet();
Console.WriteLine(string.Join(", ", set)); // 1, 2, 3(順不同の場合あり)
Console.WriteLine(set.Contains(2)); // true
// LINQ の結果を辞書に変換して高速検索に使います。
var products = new List<(string Code, string Name, int Price)>
{
("A001", "りんご", 150),
("A002", "みかん", 80),
("B001", "にんじん", 100),
};
var priceByCode = products.ToDictionary(p => p.Code, p => p.Price);
Console.WriteLine(priceByCode["A001"]); // 150
概要
LINQ メソッドは遅延評価のため、列挙するたびに再計算が走ります。『ToList()』や『ToArray()』を呼ぶと即時評価されてメモリ上に展開されるため、複数回参照する場合やクエリが重い場合に効果的です。
『ToDictionary()』はキーが重複している場合に『ArgumentException』を投げます。重複キーが存在する可能性がある場合は事前に『DistinctBy()』で除去するか、複数の値を持てる『ToLookup()』を使ってください。
変換前のシーケンスを絞り込みたい場合は『Enumerable.Where()』を、重複除去のみが目的の場合は『Enumerable.Distinct()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。