C#中的array.map()示例?


78

考虑以下常见的JavaScript构造

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

提供期望的结果,这是一个年龄段。

C#中这等效于什么?请提供一个简单的示例。该文档指出select或可能出现,selectAll但我找不到在线示例或可以粘贴并起作用的任何其他SO问题。

如果可能,给出一个示例,将以下数组{1,2,3,4}转换为following {'1a','2a','3a','4a'}。对于每个元素,将“ a”附加到末尾,将其从Integer转换为String。


1
(new[]{1,2,3,4}).Select(v => String.Format("{0}a", v))
阿列克谢·莱文科夫

1
@AlexeiLevenkov您最后错过了.ToArray()
科里2015年

Answers:


117

这称为投影,Select在LINQ中称为投影。那不会返回一个新的数组(就像JavaScript.map那样),而是一个返回IEnumerable<T>。您可以使用将其转换为数组.ToArray

using System.Linq; // Make 'Select' extension available
...
var ages = people.Select(person => person.Age).ToArray();

Select与所有IEnumerable<T>数组实现一起使用。您只需要.NET 3.5和一条using System.Linq;语句。

对于第二个示例,请使用类似以下的内容。请注意,没有使用数组,只有序列。

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

在c#6上:var items = Enumerable.Range(1, 4).Select(num => string.Format($"{num}a"));
Bart Calixto

17

仅用于信息,如果peopleList<Person>,则ConvertAll方法与JS的方法非常相似map,例如:

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

但是,如果您有一个Array并想使用任何List<T>方法,则可以通过将变量转换为Array中的List来轻松实现,例如:

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

最后,如果您确实需要一个Array,则可以将其转换回来,例如:

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

但是最后一个示例不如其他答案那么好,Select如果仅使用数组,则应使用。但是,如果可以的话,我建议您转到List<T>,这会更好!


转换为List并使用ConvertAll允许我重构不允许在Linq中使用参数构造函数的大型Select代码
V-SHY

5

集合上的LINQ扩展方法为您提供了许多非常方便的实用程序。Select是其中之一:

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

相关文档:

可枚举

基本LINQ查询操作(C#)


这与@Richard Schneider的答案有何不同。还有需要做ToList()吗?
Prashanth Thurairatnam

1

Linq's.Selectmap等效的,.Aggregate也是fold等效的。

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

1

您可以使用关键字fromselectinwhile;
或举个例子:

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

因此,本质上语法将是:

 <<list-output>> = (from <<var-name>> in <<list-input>> select <<operation>>);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.