この記事は機械翻訳されています。英語版の記事を表示するには、[英語] のチェック ボックスをオンにしてください。また、テキストにマウス ポインターを合わせると、ポップアップ ウィンドウに英語のテキストを表示することもできます。
翻訳
英語

Enumerable.SelectMany<TSource, TResult> メソッド (IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>)

 

公開日: 2016年11月

シーケンスの各要素、 IEnumerable<T> し、結果のシーケンスを 1 つのシーケンスに平坦化します。

名前空間:   System.Linq
アセンブリ:  System.Core (System.Core.dll 内)

public static IEnumerable<TResult> SelectMany<TSource, TResult>(
	this IEnumerable<TSource> source,
	Func<TSource, IEnumerable<TResult>> selector
)

パラメーター

source
Type: System.Collections.Generic.IEnumerable<TSource>

射影する値のシーケンス。

selector
Type: System.Func<TSource, IEnumerable<TResult>>

各要素に適用する変換関数。

戻り値

Type: System.Collections.Generic.IEnumerable<TResult>

IEnumerable<T> 要素が入力シーケンスの各要素に対して一対多の変換関数の呼び出しの結果。

型パラメーター

TSource

要素の型 sourceします。

TResult

によって返されるシーケンスの要素の型 selectorします。

Exception Condition
ArgumentNullException

source または selectornull です。

このメソッドは遅延実行を使用して実装されます。 すぐに、値は、操作を実行するために必要なすべての情報を格納するオブジェクトを返します。 オブジェクトのいずれかを呼び出すことが列挙されるまで、このメソッドで表されるクエリは実行されません、 GetEnumerator メソッドを使用して直接または foreach で Visual C# または For Each で Visual Basicします。

SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) メソッドは、入力シーケンスを列挙、各要素にマップする変換関数を使用して、 IEnumerable<T>, を列挙して、各などの要素が返さ IEnumerable<T> オブジェクトです。 つまりの各要素に対して source, 、selector が呼び出される一連の値が返されます。 SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) この 2 次元のコレクションを 1 次元のコレクションをフラット化し、 IEnumerable<T> しそれを取得します。 たとえば、次のクエリで使用される SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) の注文を取得する (型の Order) データベース内の各顧客について、結果は型は IEnumerable<Order> C# の場合または IEnumerable(Of Order) で Visual Basicします。 クエリの代わりに使用する場合 Select<TSource, TResult> 、注文を取得するには、注文のコレクションのコレクションを組み合わせることはできませんし、結果は型の IEnumerable<List<Order>> C# の場合、または IEnumerable(Of List(Of Order)) で Visual Basicします。

クエリ式の構文で各 from 句 (Visual C#) または From 句 (Visual Basic) の呼び出しに 1 つは変換の頭文字の後 SelectMany<TSource, TResult>します。

次のコード例では、使用して SelectMany<TSource, TResult>(IEnumerable<TSource>, Func<TSource, IEnumerable<TResult>>) を配列の一対多の射影を実行します。

class PetOwner
{
    public string Name { get; set; }
    public List<String> Pets { get; set; }
}

public static void SelectManyEx1()
{
    PetOwner[] petOwners = 
        { new PetOwner { Name="Higa, Sidney", 
              Pets = new List<string>{ "Scruffy", "Sam" } },
          new PetOwner { Name="Ashkenazi, Ronen", 
              Pets = new List<string>{ "Walker", "Sugar" } },
          new PetOwner { Name="Price, Vernette", 
              Pets = new List<string>{ "Scratches", "Diesel" } } };

    // Query using SelectMany().
    IEnumerable<string> query1 = petOwners.SelectMany(petOwner => petOwner.Pets);

    Console.WriteLine("Using SelectMany():");

    // Only one foreach loop is required to iterate 
    // through the results since it is a
    // one-dimensional collection.
    foreach (string pet in query1)
    {
        Console.WriteLine(pet);
    }

    // This code shows how to use Select() 
    // instead of SelectMany().
    IEnumerable<List<String>> query2 =
        petOwners.Select(petOwner => petOwner.Pets);

    Console.WriteLine("\nUsing Select():");

    // Notice that two foreach loops are required to 
    // iterate through the results
    // because the query returns a collection of arrays.
    foreach (List<String> petList in query2)
    {
        foreach (string pet in petList)
        {
            Console.WriteLine(pet);
        }
        Console.WriteLine();
    }
}

/*
 This code produces the following output:

 Using SelectMany():
 Scruffy
 Sam
 Walker
 Sugar
 Scratches
 Diesel

 Using Select():
 Scruffy
 Sam

 Walker
 Sugar

 Scratches
 Diesel
*/

ユニバーサル Windows プラットフォーム
8 以降で使用可能
.NET Framework
3.5 以降で使用可能
ポータブル クラス ライブラリ
サポート対象: 移植可能 .NET プラットフォーム
Silverlight
2.0 以降で使用可能
Windows Phone Silverlight
7.0 以降で使用可能
Windows Phone
8.1 以降で使用可能
トップに戻る
表示: