C#/ Linq:IEnumerableの各要素にマッピング関数を適用しますか?


107

(Linq互換の方法で)マッピング関数を使用してIEnumerableの各要素を別の要素に変換する方法を探していましたが、何も見つかりませんでした。

(非常に単純な)例の場合、次のようなことができるはずです

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<string> strings = integers.Transform(i => i.ToString());

しかし、私は何も見つけていません。つまり、それを実現する拡張メソッドを書くのは簡単です(基本的に、必要なのは、ソース列挙子を新しいクラスにラップしてから、その呼び出しを委任するためのボイラープレートコードを少し書くことです)。これはかなり基本的な操作であり、自分で書くことはホイールを再発明するような気がします-使用すべき組み込みの方法があるかもしれないという気持ちを揺さぶることはできません。それ。

では、Linqには、上記で説明したことを実行できる何かがありますか?


回答:


172

あなたはSelect()拡張メソッドを使うことができます:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };
IEnumerable<string> strings = integers.Select(i => i.ToString());

またはLINQ構文では:

IEnumerable<int> integers = new List<int>() { 1, 2, 3, 4, 5 };

var strings = from i in integers
              select i.ToString();

4
ああ!私は道がなければならないことを知っていました。古い「フォレスト/ツリーのビジュアルオクルージョンの問題」の一部だと思います:)
Andreas Baus

2
マップに副作用がある場合、Select()列挙されるまで本体が実行されるとは限らないため、問題が発生する可能性があることに注意してください。それを行うのは良い考えではありませんが、ToList()リスト全体を評価するように強制するために追加する必要がある状況があるかもしれません。
Dave Nichol

6
一方の形式を「linqクエリ構文」、もう一方の形式を「linqメソッド構文」と呼ぶ方が正しいのではないですか?
Ryan Harmuth、2015

2
実際にはどちらもLinq構文タイプであり、最初の1つはメソッド構文と呼ばれ、2つ目はクエリ構文と呼ばれます。もっと読む:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/...
マチャド

27

あなたが探しています Select入力シーケンスを変換\投影するために使用できるものいます:

IEnumerable<string> strings = integers.Select(i => i.ToString());

9
公平を期すために、SQL(用語の後者のセットは共通の用語である)と一致するはずだ
éclairevoyant

5
それはかなり迷惑です。私は関数型プログラミングを学ぼうとしていますが、10年間のLINQ用語を学習する必要があります。翻訳ガイドが必要です。Googleの翻訳が役立つのではないかと思います...
Damien Sawyer
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.