考虑以下常见JavaScript构造
var ages = people.map(person => person.age);
给出期望的结果,这是一系列年龄。
C#中的相应内容是什么?请举一个简单的例子。文档指出select
或可能selectAll
,但我找不到在线示例或任何其他可以粘贴并运行的SO问题。
如果可能,请举例将以下数组{1,2,3,4}
转换为以下{'1a','2a','3a','4a'}
。对于每个元素,在末尾附加“a”,将其从Integer转换为String。
答案 0 :(得分:68)
这称为投影,在LINQ中称为Select
。这不会返回一个新数组(就像JavaScript .map
所做的那样),而是IEnumerable<T>
。您可以使用.ToArray
将其转换为数组。
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));
答案 1 :(得分:7)
仅对于信息,如果Loc
是people
,则List<Person>
方法与JS的ConvertAll
非常相似,例如:
map
但是如果你有一个数组而你想使用任何var ages = people.ConvertAll<int>(person => person.age);
方法,你可以通过将你的变量转换为数组中的List来轻松实现这一点,例如:
List<T>
最后,如果你确实需要一个Array,那么你可以将它转换回来,例如:
var ages = people.ToList().ConvertAll<int>(person => person.age);
但是最后一个例子不如其他答案那么好,如果你只使用Arrays,你应该使用var ages = people.ToList().ConvertAll<int>(person => person.age).ToArray();
。但如果可以的话,我建议您转到Select
,它会好得多!
答案 2 :(得分:2)
集合上的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-liner:
string[] arr2 = arr.Select(el => el + "a").ToArray();
一个工作示例:
相关文档:
答案 3 :(得分:1)
Linq的.Select
是等效的map
而.Aggregate
是等效的fold
。
var nums = new[] {1,2,3,4};
string[] r = nums.Select(x => x + "a").ToArray();
答案 4 :(得分:0)
您可以使用关键字from
,select
,in
和while
;
或者为你的例子:
var ages = (from person in people select person.age).ToArray();
基本上语法是:
<<list-output>> = (from <<var-name>> in <<list-input>> select <<operation>>);
答案 5 :(得分:0)
如果您不想执行到/从数组的转换 Array.ConvertAll
可以到工作。它在 Array
命名空间的 System
类中声明(记得在文件顶部添加 using System;
)为:
public static TOutput[] ConvertAll<TInput,TOutput> (TInput[] array, Converter<TInput,TOutput> converter);
示例:
var items = new[] {"abc", "ab", "abcde"};
var result = Array.ConvertAll(items, p => p.Length);
Console.Out.WriteLine(string.Join(", ", result)); // Outputs 3, 2, 5
方法参考:https://docs.microsoft.com/en-us/dotnet/api/system.array.convertall?view=net-5.0
查看此部分以了解 .NET 版本兼容性:https://docs.microsoft.com/en-us/dotnet/api/system.array.convertall?view=net-5.0#applies-to