C#转Python第2.3篇上周帮同事 review 代码他一行 Python 让我愣了 5 秒上周帮同事 review 代码他甩过来一行 Python[x * 2 for x in nums if x 0]。我愣了 5 秒——这不就是我用 LINQ 写了三年的Where().Select()吗一行顶三行Python 玩家果然任性。不过等我看到后面的需求——分组、聚合、延迟执行——我又默默打开了 C# 的 LINQ。两种写法各有各的杀手锏C# 的 LINQ 像是流水线Python 的推导式像是压缩包。基础语法对比C# 版本var numbers new Listint { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // 筛选 var evens numbers.Where(x x % 2 0).ToList(); // 转换 var doubled numbers.Select(x x * 2).ToList(); // 排序 var sorted numbers.OrderByDescending(x x).ToList(); // 聚合 var sum numbers.Sum(); var avg numbers.Average(); // 链式调用 var result numbers .Where(x x 3) .Select(x x * 2) .OrderBy(x x) .ToList(); // C# 12 集合表达式更简洁 int[] nums [1, 2, 3, 4, 5]; Listint list [1, 2, 3, 4, 5]; IEnumerableint more [.. nums, 6, 7, 8]; // 展开运算符Python 版本numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 筛选 evens [x for x in numbers if x % 2 0] # 转换 doubled [x * 2 for x in numbers] # 排序 sorted_list sorted(numbers, reverseTrue) # 聚合 total sum(numbers) avg sum(numbers) / len(numbers) # 链式操作 result [x * 2 for x in numbers if x 3] result sorted([x * 2 for x in numbers if x 3])对比一下操作C# LINQPython 列表推导式筛选list.Where(x x 0)[x for x in list if x 0]转换list.Select(x x * 2)[x * 2 for x in list]排序list.OrderBy(x x)sorted(list)聚合list.Sum()sum(list)链式.Where().Select().ToList()[... for x in list if ...]C# 的 LINQ 是方法链Python 的推导式是表达式压缩。复杂操作对比多条件筛选C# 版本var users GetUsers(); // 多条件筛选 var result users .Where(u u.Age 18) .Where(u u.IsActive) .Where(u u.Score 80) .ToList(); // 或者用 连接 var result2 users .Where(u u.Age 18 u.IsActive u.Score 80) .ToList();Python 版本users get_users() # 多条件筛选 result [u for u in users if u[age] 18 and u[is_active] and u[score] 80] # 或者分行写 result [ u for u in users if u[age] 18 and u[is_active] and u[score] 80 ]嵌套循环C# 版本// 笛卡尔积 var colors new[] { 红, 蓝, 绿 }; var sizes new[] { S, M, L }; var combinations colors .SelectMany(c sizes, (c, s) new { Color c, Size s }) .ToList(); // 或者用嵌套 Select var combinations2 colors .SelectMany(c sizes.Select(s new { Color c, Size s })) .ToList();Python 版本# 笛卡尔积 colors [红, 蓝, 绿] sizes [S, M, L] combinations [(c, s) for c in colors for s in sizes] # 等价于 combinations [] for c in colors: for s in sizes: combinations.append((c, s))Python 的嵌套循环更直观C# 需要SelectMany。字典推导C# 版本var users new ListUser { /* ... */ }; // 转换为字典 var userDict users.ToDictionary(u u.Id, u u.Name); // 用 LINQ 生成字典 var priceDict products .Where(p p.IsActive) .ToDictionary(p p.Id, p p.Price);Python 版本users [{id: 1, name: 张三}, ...] # 字典推导 user_dict {u[id]: u[name] for u in users} # 带条件的字典推导 price_dict { p[id]: p[price] for p in products if p[is_active] }集合推导C# 版本var numbers new Listint { 1, 2, 2, 3, 3, 3, 4 }; // 用 HashSet 去重 var unique new HashSetint(numbers); // 用 LINQ Distinct var distinct numbers.Distinct().ToList();Python 版本numbers [1, 2, 2, 3, 3, 3, 4] # 集合推导自动去重 unique {x for x in numbers} # {1, 2, 3, 4} # 列表去重保持顺序 distinct list(dict.fromkeys(numbers)) # [1, 2, 3, 4]性能对比C# 版本// LINQ 延迟执行 var query numbers.Where(x x 0); // 不会立即执行 var result query.ToList(); // 这里才执行 // 可以利用延迟执行优化 var result numbers .Where(x x 0) // 延迟 .Select(x x * 2) // 延迟 .Take(10) // 延迟 .ToList(); // 执行只处理前 10 个Python 版本# 列表推导式立即执行 result [x * 2 for x in numbers if x 0] # 立即创建整个列表 # 生成器表达式延迟执行 result (x * 2 for x in numbers if x 0) # 不会立即创建列表 # 用 next() 取第一个 first next(x * 2 for x in numbers if x 0) # 或者用生成器配合函数 result list(islice( (x * 2 for x in numbers if x 0), 10 ))C# 的 LINQ 天然支持延迟执行Python 需要用生成器表达式。可读性对比C# 版本// 复杂的链式调用 var result orders .Where(o o.Status OrderStatus.Completed) .Where(o o.OrderDate DateTime.Now.AddDays(-30)) .SelectMany(o o.Items) .GroupBy(i i.ProductId) .Select(g new { ProductId g.Key, TotalQuantity g.Sum(i i.Quantity), TotalAmount g.Sum(i i.Quantity * i.Price) }) .OrderByDescending(x x.TotalAmount) .Take(10) .ToList();Python 版本# 等价的 Python 写法 result [ { product_id: product_id, total_quantity: sum(i[quantity] for i in items), total_amount: sum(i[quantity] * i[price] for i in items) } for product_id, items in groupby( [ i for o in orders if o[status] completed and o[order_date] datetime.now() - timedelta(days30) for i in o[items] ], keylambda i: i[product_id] ) ] # 或者用 Pandas更清晰 import pandas as pd df pd.DataFrame(orders) result ( df[df[status] completed] .query(order_date thirty_days_ago) .explode(items) .groupby(product_id) .agg({quantity: sum, amount: sum}) .nlargest(10, amount) )C# 的 LINQ 链更清晰Python 的复杂推导式可读性较差。设计哲学C# 的 LINQ 是方法链模式——每个操作返回新的序列可以链式调用适合复杂的数据处理管道。Python 的推导式是表达式压缩——用一行代码表达复杂的逻辑适合简单的转换和筛选。C# 的 LINQ 像是流水线每个环节清晰可见 Python 的推导式像是压缩包解压后才能看清内部。坑点提醒Python 推导式的变量泄漏——变量会泄漏到外部作用域x 10 result [x for x in range(5)] print(x) # 4不是 10 了 # 避免方法Python 3.0 的推导式有自己的作用域 # 但在旧版本中推导式变量会泄漏过度嵌套的推导式——可读性灾难# 不好嵌套太深 result [ f(x, y) for x in range(10) for y in range(10) if g(x, y) for f in [h1, h2, h3] if condition(f, x, y) ] # 好拆分成多步 filtered [(x, y) for x in range(10) for y in range(10) if g(x, y)] result [f(x, y) for x, y in filtered for f in [h1, h2, h3] if condition(f, x, y)]C# 的 LINQ 方法命名——英语不好会很痛苦// 需要记住很多方法名 // Where, Select, SelectMany, OrderBy, ThenBy // GroupBy, Distinct, Except, Intersect, Union // Any, All, First, Last, Single // Sum, Average, Min, Max, Count // Python 的关键字更直观 # for, in, if, sorted, sum, len性能陷阱——不必要的转换// 不好多次转换 var result list.Where(x x 0).Select(x x * 2).ToList(); // 好一次转换 var result list.Where(x x 0).Select(x x * 2).ToList(); // 上面两个一样但注意不要在循环中多次调用 ToList()# 不好多次创建列表 result1 [x for x in numbers if x 0] result2 [x * 2 for x in result1] # 好一次完成 result [x * 2 for x in numbers if x 0]迁移指南C# 开发者最容易犯的错混淆推导式和生成器表达式[x for x in list]立即创建列表(x for x in list)是生成器忘记推导式变量泄漏Python 3.12 之前推导式变量会泄漏到外部作用域过度使用推导式复杂逻辑应该用普通循环可读性更重要**用sorted()代替.OrderBy()**sorted()返回新列表原列表不变**用sum()/len()代替.Average()**Python 没有内置的average()函数**用in代替.Contains()**x in list比list.__contains__(x)更 Pythonic一句话总结C# 的 LINQ 是流水线Python 的推导式是压缩包——都能处理集合但风格完全不同。下一篇咱们来聊聊生成器与迭代器——C# 的yield return和 Python 的yield几乎一样的设计哲学示例代码C# 转 Python 全系列配套练习代码含 48 章示例GitHubGitHub - LadyKiller1025/csharp-python-demos: C# vs Python 学习系列 - Demo 代码合集 · GitHubGiteehttps://gitee.com/qakjhzx/csharp-python-demos 欢迎点赞、收藏、转发你的支持是我持续创作的动力
企业数字化 ERP 产品动态
相关推荐
ToB销售怎么找高价值客户?用价值力重构三个动作 PSS⁵价值力:不再盲目撒网,让精准客户主动上门客户难找、转化慢、成本高,很多ToB销售团队卡在第一步。本文从PSS⁵价值力出发,拆解如何构建客户筛选的“价值雷达”,通过三个可落地的动作,让高价值客户浮出水… · 2026/10/31 16:37:09
揭秘Cesium地下可视化:从“穿墙术“到地质勘探的WebGL魔法 揭秘Cesium地下可视化:从"穿墙术"到地质勘探的WebGL魔法 【免费下载链接】cesium An open-source JavaScript library for world-class 3D globes and maps :earth_americas: 项目地址: https://gitcode.com/GitHub_Trending/ce/cesium
想知道如何… · 2026/11/11 14:27:17
低压电工证过期了不知道怎么复审?考低压电工证需要什么良心建议 低压电工证过期了不知道怎么复审?考低压电工证需要什么良心建议 证书过期了不知道怎么复审延期?你不是一个人在战斗,很多同行都遇到过这个问题。尤其是像我们这类在济源从事市政公用工程的电工,低压电工证就像我们的“通行证”,一旦过期,不仅影响项目投… · 2026/11/14 15:58:12
荥阳报考电工证多少钱?工地太忙根本没时间复习考试 荥阳报考电工证多少钱?工地太忙根本没时间复习考试 工地太忙根本没时间复习考试,再加上考证流程复杂,很多人一拖再拖,结果错过了好机会。特别是现在荥阳报考电工证的门槛越来越高,流程也越来越规范,不提前了解清楚,容易在细节上栽跟头。而且你知道吗,… · 2026/11/14 15:58:12
化工厂考什么电工证千万别踩坑:实操考试心里没底怕挂科?这几点必须知道 化工厂考什么电工证千万别踩坑:实操考试心里没底怕挂科?这几点必须知道 实操考试心里没底怕挂科,是很多准备报考化工厂电工证的学员共同的焦虑。尤其是对于刚入行的济源房建工程从业者,面对复杂的考试流程和严苛的实操要求,很容易踩坑。别慌,这篇文章会… · 2026/11/14 15:58:12
长客考电工证怎么选才不踩坑 上岗必备的实操技巧全解析 长客考电工证怎么选才不踩坑 上岗必备的实操技巧全解析 实操考试心里没底怕挂科,这几乎是每个准备考【长客考电工证】的人的共同焦虑。特别是像郑州金水区这样特种作业需求旺盛的区域,电工证不仅是上岗必备的通行证,更是你进入工地、工厂、电力公司等岗位… · 2026/11/14 15:57:12
电工证丢失还能补吗?千万别踩坑,丢了证等于失业 电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。… · 2026/11/13 22:30:50
电力电缆作业证直播报名入口与办理流程良心建议 电力电缆作业证直播报名入口与办理流程良心建议 你是不是也担心学历不高报不了名?别急,今天就给你讲讲 电力电缆作业证直播 的报名流程和那些你必须知道的干货, 良心建议 在这里,别错过。 电力电缆作业证直播报名需要什么条件?… · 2026/11/14 13:23:47
英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 英德电工证报考费多少钱,怕考不过白交培训费?看完这篇别再踩坑 怕考不过白交培训费?英德电工证报考费多少钱,你真的了解吗?现在市面上培训机构五花八门,价格参差不齐,很多人一不小心就花了冤枉钱,结果还考不过。别急,今天就来给你说清楚英德电工证的… · 2026/11/14 13:20:59
有初级电工证怎么工作 2026河南最新政策怎么应对 有初级电工证怎么工作 2026河南最新政策怎么应对 之前考的证在外省能不能转过来?这个问题我每天被问上百次。2026年河南最新政策对证书跨省转移有了明确说明,特别是南阳市的从业者,需要特别关注。… · 2026/11/14 0:00:31
电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略 电工证过期了不知道怎么复审?考电工证自学书+官方报名入口全攻略 证书过期了不知道怎么复审延期?很多人遇到这种情况,要么是工作太忙没时间处理,要么是不知道具体流程,导致证书失效,影响工作和项目进展。其实复审并不难,关键是要找准官方报名入口,掌… · 2026/11/14 0:00:31
为什么要低压电工证实操考试考什么 为什么低压电工证值不值得考?别再被中介骗了 你是不是也经常看到网上有人在问“低压电工证到底值不值得考”?或者在找报名点时,担心被中间人骗钱?这些问题,我懂,我也经历过。作为一名在应急管理行业摸爬滚打多年的从业者,我深知低压电工证不仅是一个从… · 2026/11/14 0:00:31
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:12:21
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 6:11:51
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案 /* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/13 22:31:30