Enumerable.Select 方法

定义

将序列中的每个元素投影到新表单。

重载

Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,TResult>)

通过合并元素的索引,将序列的每个元素投影到新窗体中。

Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>)

将序列中的每个元素投影到新表单。

Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,TResult>)

通过合并元素的索引,将序列的每个元素投影到新窗体中。

public:
generic <typename TSource, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ Select(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, int, TResult> ^ selector);
public static System.Collections.Generic.IEnumerable<TResult> Select<TSource,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,int,TResult> selector);
static member Select : seq<'Source> * Func<'Source, int, 'Result> -> seq<'Result>
<Extension()>
Public Function Select(Of TSource, TResult) (source As IEnumerable(Of TSource), selector As Func(Of TSource, Integer, TResult)) As IEnumerable(Of TResult)

类型参数

TSource

source 的元素类型。

TResult

selector 返回的值的类型。

参数

source
IEnumerable<TSource>

一个值序列,要对该序列调用转换函数。

selector
Func<TSource,Int32,TResult>

一个应用于每个源元素的转换函数;函数的第二个参数表示源元素的索引。

返回

IEnumerable<TResult>

一个 IEnumerable<T>,其元素是对 source 的每个元素调用转换函数得到的结果。

例外

sourceselectornull

示例

下面的代码示例演示如何使用 Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,Int32,TResult>) 对值序列进行投影并使用每个元素的索引。

string[] fruits = { "apple", "banana", "mango", "orange",
                      "passionfruit", "grape" };

var query =
    fruits.Select((fruit, index) =>
                      new { index, str = fruit.Substring(0, index) });

foreach (var obj in query)
{
    Console.WriteLine("{0}", obj);
}

/*
 This code produces the following output:

 { index = 0, str =  }
 { index = 1, str = b }
 { index = 2, str = ma }
 { index = 3, str = ora }
 { index = 4, str = pass }
 { index = 5, str = grape }
*/
' Create an array of strings.
Dim fruits() As String =
{"apple", "banana", "mango", "orange", "passionfruit", "grape"}

' Project each item in the array to an anonymous type
' that stores the item's index in the array and
' a substring of each item whose length is equal
' to the index position in the original array.
Dim query =
fruits.Select(Function(fruit, index) _
                  New With {index, .Str = fruit.Substring(0, index)})

Dim output As New System.Text.StringBuilder
For Each obj In query
    output.AppendLine(obj.ToString())
Next

' Display the output.
Console.WriteLine(output.ToString())

' This code produces the following output:
'
' { index = 0, Str =  }
' { index = 1, Str = b }
' { index = 2, Str = ma }
' { index = 3, Str = ora }
' { index = 4, Str = pass }
' { index = 5, Str = grape }

注解

此方法通过使用延迟执行来实现。 即时返回值是一个对象,用于存储执行操作所需的所有信息。 在通过直接调用GetEnumerator其方法或通过在 C# For Eachforeach Visual Basic 中使用 来枚举对象之前,不会执行此方法表示的查询。

的第一个 selector 参数表示要处理的元素。 第二个参数表示 selector 源序列中该元素的从零开始的索引。 例如,如果元素以已知顺序排列,并且你想要使用特定索引处的元素执行某些操作,则这非常有用。 如果要检索一个或多个元素的索引,它也很有用。

此投影方法要求转换函数 selector为源序列 source中的每个值生成一个值。 如果 selector 返回的值本身是集合,则由使用者手动遍历子序列。 在这种情况下,查询可能最好返回单个合并的值序列。 若要实现此目的,请使用 SelectMany 方法而不是 Select。 虽然 SelectMany 工作方式与 Select类似,但它的不同之处在于,转换函数返回一个集合,该集合在返回之前由 SelectMany 扩展。

适用于

Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>)

将序列中的每个元素投影到新表单。

public:
generic <typename TSource, typename TResult>
[System::Runtime::CompilerServices::Extension]
 static System::Collections::Generic::IEnumerable<TResult> ^ Select(System::Collections::Generic::IEnumerable<TSource> ^ source, Func<TSource, TResult> ^ selector);
public static System.Collections.Generic.IEnumerable<TResult> Select<TSource,TResult> (this System.Collections.Generic.IEnumerable<TSource> source, Func<TSource,TResult> selector);
static member Select : seq<'Source> * Func<'Source, 'Result> -> seq<'Result>
<Extension()>
Public Function Select(Of TSource, TResult) (source As IEnumerable(Of TSource), selector As Func(Of TSource, TResult)) As IEnumerable(Of TResult)

类型参数

TSource

source 的元素类型。

TResult

selector 返回的值的类型。

参数

source
IEnumerable<TSource>

一个值序列,要对该序列调用转换函数。

selector
Func<TSource,TResult>

应用于每个元素的转换函数。

返回

IEnumerable<TResult>

一个 IEnumerable<T>,其元素是对 source 的每个元素调用转换函数得到的结果。

例外

sourceselectornull

示例

下面的代码示例演示如何使用 对值序列进行 Select<TSource,TResult>(IEnumerable<TSource>, Func<TSource,TResult>) 投影。

IEnumerable<int> squares =
    Enumerable.Range(1, 10).Select(x => x * x);

foreach (int num in squares)
{
    Console.WriteLine(num);
}
/*
 This code produces the following output:

 1
 4
 9
 16
 25
 36
 49
 64
 81
 100
*/
' Create a collection of sequential integers
' from 1 to 10 and project their squares.
Dim squares As IEnumerable(Of Integer) =
Enumerable.Range(1, 10).Select(Function(x) x * x)

Dim output As New System.Text.StringBuilder
For Each num As Integer In squares
    output.AppendLine(num)
Next

' Display the output.
Console.WriteLine(output.ToString())

' This code produces the following output:
'
' 1
' 4
' 9
' 16
' 25
' 36
' 49
' 64
' 81
' 100

注解

此方法通过使用延迟执行来实现。 即时返回值是一个对象,用于存储执行操作所需的所有信息。 在通过直接调用GetEnumerator其方法或通过在 C# For Eachforeach Visual Basic 中使用 来枚举对象之前,不会执行此方法表示的查询。

此投影方法要求转换函数 selector为源序列 source中的每个值生成一个值。 如果 selector 返回的值本身是集合,则由使用者手动遍历子序列。 在这种情况下,查询可能最好返回单个合并的值序列。 若要实现此目的,请使用 SelectMany 方法而不是 Select。 虽然 SelectMany 工作方式与 Select类似,但它的不同之处在于,转换函数返回一个集合,该集合在返回之前由 SelectMany 扩展。

在查询表达式语法中, select (C#) 或 Select (Visual Basic) 子句转换为 的调用 Select

另请参阅

适用于