web-dev-qa-db-ja.com

C#のarray.map()の例?

次の一般的なJavaScriptコンストラクトを検討してください

var ages = people.map(person => person.age);

年齢の配列である望ましい結果を与える。

C#でこれに相当するものは何ですか?簡単な例を含めてください。ドキュメントにはselectまたは可能性のあるselectAllが示されていますが、オンラインまたは他のSO質問を貼り付けて機能する質問)の例を見つけることができません。

可能であれば、次の配列{1,2,3,4}を次の{'1a','2a','3a','4a'}。各要素について、末尾に「a」を追加し、整数から文字列に変換します。

46
Code Whisperer

これは、LINQではSelectと呼ばれるプロジェクションと呼ばれます。これは、JavaScriptの.mapのように新しい配列を返しませんが、IEnumerable<T>を返します。 .ToArrayで配列に変換できます。

var ages = people.Select(person => person.Age).ToArray();

Selectは、配列が実装するすべてのIEnumerable<T>で機能します。 .NET 3.5とusing System.Linq;ステートメントが必要です。

2番目の例では、このようなものを使用します。使用中の配列はありません-シーケンスのみです。

 var items = Enumerable.Range(1, 4).Select(num => string.Format("{0}a", num));
75
Daniel A. White

情報についてのみ、peopleList<Person>である場合、ConvertAllメソッドはJSのmapと非常に似ています。

var ages = people.ConvertAll<int>(person => person.age);

ただし、配列があり、List<T>メソッドを使用する場合は、変数を配列からリストに変換することで簡単に実現できます。例:

var ages = people.ToList().ConvertAll<int>(person => person.age);

そして最後に、本当に配列を戻す必要がある場合、それを元に戻すことができます、例えば:

var ages = people.ToList().ConvertAll<int>(person => person.age).ToArray();

しかし、その最後の例は他の回答ほど良くはないので、配列のみで作業している場合はSelectを使用する必要があります。しかし、可能であれば、List<T>に移行することをお勧めします。

8
Buzinas

コレクションのLINQ拡張メソッドは、本当に便利なユーティリティのホストを提供します。 Selectはそれらの1つです。

int[] arr = { 1, 2, 3 };
IEnumerable<string> list = arr.Select(el => el + "a");
string[] arr2 = list.ToArray();

foreach (var str in arr2)
    Console.Write(str + " ");

これは出力するはずです:

1a 2a 3a

これは安全に1ライナーに凝縮できます。

string[] arr2 = arr.Select(el => el + "a").ToArray();

実例:

https://ideone.com/mxxvfy

関連ドキュメント:

Enumerable.Select

基本的なLINQクエリ操作(C#)

3
pb2q

Linqの.Selectmapに相当し、.Aggregatefoldと同等です。

var nums = new[] {1,2,3,4};
string[] r = nums.Select(x => x + "a").ToArray();
1

キーワードfromselectinおよびwhileを使用できます。
または例:

 var ages = (from person in people select person.age).ToArray();

したがって、基本的に構文は次のようになります。

 <<list-output>> = (from <<var-name>> in <<list-input>> select <<operation>>);
0
merlin