遍历数组,对每个元素执行回调函数,并返回包含结果的新数组:
const numbers = [1, 2, 3];
const squared = numbers.map(x => x * x);
遍历集合(如 List<T>、IEnumerable<T>),对每个元素应用转换函数,并返回新的序列:
var numbers = new List<int> { 1, 2, 3 };
var squared = numbers.Select(x => x * x);
| 特性 | JavaScript .map() | C# .Select() |
| 基本语法 |
array.map(callback(currentValue, index, array)) |
collection.Select((element, index) => expression) |
| 参数 |
- currentValue:当前元素 - index:当前索引 - array:原数组 |
- element:当前元素 - index(可选):当前索引 |
| 返回值 |
新数组,长度与原数组一致 |
IEnumerable<T>(可通过 .ToList() 转为列表) |
JavaScript:
const letters = ['a', 'b', 'c'];
const withIndex = letters.map((letter, index) => `${index}: ${letter}`);
C#:
var letters = new List<char> { 'a', 'b', 'c' };
var withIndex = letters.Select((letter, index) => $"{index}: {letter}");
JavaScript:
const users = [{ name: 'Alice', age: 30 }, { name: 'Bob', age: 25 }];
const names = users.map(user => user.name);
C#:
var users = new List<User> {
new User { Name = "Alice", Age = 30 },
new User { Name = "Bob", Age = 25 }
};
var names = users.Select(user => user.Name);
两者都采用 ** 延迟执行(Lazy Evaluation)** 策略:
- JavaScript:
.map() 立即执行并返回新数组。
- C#:
.Select() 返回可枚举对象,实际转换在迭代时发生(如调用 .ToList() 或 foreach 时)。
例如:
var numbers = Enumerable.Range(1, 3);
var squared = numbers.Select(x => x * x);
- JavaScript:可通过回调函数修改元素(但不推荐):
const arr = [{ value: 1 }];
arr.map(item => { item.value = 100; return item; });
- C#:
.Select() 生成新序列,不影响原集合:
var list = new List<int> { 1, 2 };
var newList = list.Select(x => x * 10);
.Select()/.map():转换数据并返回新集合。
foreach:执行操作(如打印、保存),不返回集合。
| 特性 | JavaScript .map() | C# .Select() |
| 核心功能 |
数组元素转换 |
集合元素转换 |
| 延迟执行 |
× |
√ |
| 返回类型 |
数组 |
IEnumerable<T> |
| 常见搭配 |
箭头函数 |
Lambda 表达式 |
简单说,C# 的 .Select() 是 JavaScript .map() 在强类型语言中的等价实现,两者都是函数式编程中用于数据转换的基础工具。