C# 中的 .Select() 方法与 JavaScript 中的 .map() 方法功能类似,都是用于对集合中的每个元素进行转换并返回新的集合。

发布于:2025-07-05 ⋅ 阅读:(19) ⋅ 点赞:(0)

一、核心功能对比

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() 在强类型语言中的等价实现,两者都是函数式编程中用于数据转换的基础工具。


网站公告

今日签到

点亮在社区的每一天
去签到