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