TypeScript vs. C#: LINQ
TypeScript vs. C#: LINQ
TypeScript 没有等效于 LINQ 的语言集成自然查询方面?不能在 TypeScript 中写入以下 LINQ 语句
1
|
var adultUserNames = from u in users where u.Age >= 18 select u.Name; |
但是,位于 LINQ 核心的 iE6<T>扩展方法在 TypeScript 中具有等效项(或可以模拟)。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
Aggregate All Any Append Average Cast Concat Contains Count DefaultIfEmpty Distinct ElementAt ElementAtOrDefault Empty Except First FirstOrDefault List.ForEach GroupBy Intersect Last LastOrDefault Max Min OfType OrderBy / ThenBy Reverse Select SelectMany Single SingleOrDefault Skip SkipWhile Sum Take TakeWhile Union Where Zip |
Aggregate
1
2
3
4
5
6
|
// C# var leftToRight = users.Aggregate(initialValue, (a, u) => /* ... */ ); // TypeScript const leftToRight = users.reduce((a, u) => /* ... */ , initialValue); const rightToLeft = users.reduceRight((a, u) => /* ... */ , initialValue); |
All
1
2
3
4
5
|
// C# var allReady = users.All(u => u.IsReady); // TypeScrip tconst allReady = users.every(u => u.isReady); |
Any
1
2
3
4
5
|
// C# var isDirty = users.Any(u => u.IsDirty); // TypeScript const isDirty = users.some(u => u.isDirty); |
Append
1
2
3
4
5
|
// C# var allUsers = users.Append(oneMoreUser); // TypeScript const allUsers = [ ...users, oneMoreUser ]; |
Average
1
2
3
4
5
6
7
8
|
// C# var avgAge = users.Average(u => u.Age); // TypeScript if (users.length < 1) { throw new Error( 'source contains no elements' ); } const avgAge = users.reduce((a, u) => a + u.age, 0) / users.length; |
Cast
1
2
3
4
5
6
7
8
|
// C# var people = users.Cast<Person>(); // TypeScript const people = users as Person[]; // Note: not semantically the same. The C# version throws an exception // if any of the users can't be cast to type Person. //注意:在语义上不同。C# 版本引发异常如果无法强制转换为键入 Person 的任何用户。 |
Concat
1
2
3
4
5
|
// C# var allUsers = users.Concat(moreUsers); // TypeScript const allUsers = [ ...users, ...moreUsers ]; |
Contains
1
2
3
4
5
|
// C# var hasAdmin = users.Contains(admin); // TypeScript const hasAdmin = users.includes(admin); // Use a polyfill for IE support |
Count
1
2
3
4
5
|
// C# var n = users.Count(); // TypeScript const n = users.length; |
DefaultIfEmpty
1
2
3
4
5
|
// C# var nonEmptyUsers = Enumerable.DefaultIfEmpty(users); // TypeScript const nonEmptyUsers = users.length ? users : [ null ]; |
Distinct
1
2
3
4
5
|
// C# var uniqueNames = users.Select(u => u.Name).Distinct(); // TypeScript const uniqueNames = Object.keys(users.map(u => u.name).reduce((un, u) => ({ ...un, n }),{})); |
ElementAt
1
2
3
4
5
6
7
8
|
// C# var nth = users.ElementAt(n); // TypeScript if (n < 0 || n > users.length) { throw new Error( 'Index was out of range' ); } const nth = users[n]; |
ElementAtOrDefault
1
2
3
4
5
|
// C# var nth = users.ElementAtOrDefault(n); // TypeScript const nth = users[n]; |
Empty
1
2
3
4
5
6
7
8
|
// C# var noUsers = IEnumerable.Empty<User>(); //?.NET 4.0 没找到 找到的是DefaultIfEmpty // var noUsers = IEnumerable.DefaultIfEmpty<User>(); // TypeScript const noUsers: User[] = []; const noUsers = [] as User[]; |
Except
1
2
3
4
5
6
7
8
|
// C# var maleUsers = users.Except(femaleUsers); // TypeScript const maleUsers = users.filter ( u => !femaleUsers.includes(u) // Use a polyfill for IE support(Use a polyfill for IE support) ); |
First
1
2
3
4
5
6
7
8
|
// C# var first = users.First(); // TypeScript if (users.length < 1) { throw new Error( 'Sequence contains no elements' ); } const first = users[0]; |
FirstOrDefault
1
2
3
4
5
|
// C# var first = users.FirstOrDefault(); // TypeScript const first = users[0]; |
List.ForEach
1
2
3
4
5
|
// C# users.ToList().ForEach(u => /* ... */ ); // TypeScript users.forEach(u => /* ... */ ); |
GroupBy
1
2
3
4
5
6
7
8
9
|
// C# var usersByCountry = users.GroupBy(u => u.Country); // TypeScript const usersByCountry = users.reduce((ubc, u) => ({ ...ubc, [u.country]: [ ...(ubc[u.country] || []), u ],}), {}); |
Intersect
1
2
3
4
5
|
// C# var targetUsers = usersWhoClicked.Intersect(usersBetween25And45); // TypeScript const targetUsers = usersWhoClicked.filter(u => usersBetween25And45.includes(u) // Use a polyfill for IE support); |
Last
1
2
3
4
5
6
7
8
|
// C# var last = users.Last(); // TypeScrip tif (users.length < 1) { throw new Error( 'Sequence contains no elements' ); } const last = users[users.length - 1]; |
LastOrDefault
1
2
3
4
5
|
// C# var last = users.LastOrDefault(); // TypeScript const last = users[users.length - 1]; |
Max
1
2
3
4
5
6
7
8
|
// C# var oldestAge = users.Max(u => u.Age); // TypeScrip tif (users.length < 1) { throw new Error( 'source contains no elements' ); } const oldestAge = users.reduce((oa, u) => Math.max(oa, u.age), 0); |
Min
1
2
3
4
5
6
7
8
|
// C# var youngestAge = users.Min(u => u.Age); // TypeScript if (users.length < 1) { t hrow new Error( 'source contains no elements' ); } const youngestAge = users.reduce((ya, u) => Math.min(ya, u.age), Number.MAX_VALUE); |
OfType
1
2
3
4
5
|
// C# var bots = users.OfType<Bot>(); //根据类型刷新元素 // TypeScript // No equivalent 无等效项 |
OrderBy / ThenBy
1
2
3
4
5
6
7
8
9
10
11
12
|
// C# var sorted = users.OrderBy(u => u.Age).ThenBy(u => u.Name); // TypeScript const sorted = users.sort((a, b) => { const ageDiff = b.age - a.age; if (ageDiff) return ageDiff; return a.name.localeCompare(b.name); // Use a polyfill for IE support } ); |
Reverse
1
2
3
4
5
|
// C# var backwards = users.Reverse(); // TypeScript const backwards = users.reverse(); // Caution: users is also reversed! 原数组也翻转了 |
Select
1
2
3
4
5
|
// C# var names = users.Select(u => u.Name); // TypeScript const names = users.map(u => u.name); |
SelectMany
1
2
3
4
5
|
// C# var phoneNumbers = users.SelectMany(u => u.PhoneNumbers); // TypeScript const phoneNumbers = users.reduce((pn, u) => [ ...pn, ...u.phoneNumbers ], []); |
Single
1
2
3
4
5
6
7
8
9
10
|
// C# var user = users.Single(); // TypeScript if (users.length > 1) { throw new Error( 'The input sequence contains more than one element' ); } else if (!users.length) { throw new Error( 'The input sequence is empty' ); } const user = users[0]; |
SingleOrDefault
1
2
3
4
5
|
// C# var user = users.Single(); // TypeScript const user = users[0]; |
Skip
1
2
3
4
5
|
// C# var otherUsers = users.Skip(n); // TypeScript const otherUsers = users.filter((u, i) => i >= n); |
SkipWhile
1
2
3
4
5
6
7
|
// C# var otherUsers = users.SkipWhile(predicate); // TypeScript let i = 0; while (i < users.length && predicate(users[i++])); const otherUsers = users.slice(i - 1); |
Sum
1
2
3
4
5
6
7
8
|
// C# var totalYears = users.Sum(u => u.Age); // TypeScript if (users.length < 1) { throw new Error( 'source contains no elements' ); } const totalYears = users.reduce((ty, u) => ty + u, 0); |
Take
1
2
3
4
5
|
// C# var otherUsers = users.Take(n); // TypeScript const otherUsers = users.filter((u, i) => i < n); |
TakeWhile
1
2
3
4
5
6
7
|
// C# var otherUsers = users.TakeWhile(predicate); // TypeScript let i = 0; while (i < users.length && predicate(users[i++])); const otherUsers = users.slice(0, i - 1); |
Union
1
2
3
4
5
6
|
// C# var allUsers = someUser.Union(otherUsers); // TypeScript const allUsers = otherUsers.reduce((au, u) => au.includes(u) ? au : [ ...au, u ]}), someUsers)); // Use a polyfill for IE support |
Where
1
2
3
4
5
|
// C# var adults = users.Where(u => u.Age >= 18); // TypeScript const adults = users.filter(u => u.age >= 18); |
Zip
1
2
3
4
5
6
7
8
|
// C# var matches = buyers.Zip(sellers, (b, s) => new { Buyer = b, Seller = s }); // TypeScript const matches = [] ; for ( let i = 0; i < buyers.length && i < sellers.length; i++) { matches.push({ buyer: buyers[i], seller: sellers[i], }); } |
水平有限,请大家见谅,翻译的有误,请指出。谢谢
原文地址 https://decembersoft.com/posts/typescript-vs-csharp-linq/
TypeScript vs. C#: LINQ的更多相关文章
- 一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。
前言 TypeScript 是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架 ...
- ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。
一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript . 前言 TypeScript 是一种由微软开发的自由和开源的编程语言.它是JavaS ...
- 从C#到TypeScript - 类型
总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...
- 前端项目模块化的实践3:使用 TypeScript 的收益
以下是关于前端项目模块化的实践,包含以下内容: 搭建 NPM 私有仓库管理源码及依赖: 使用 Webpack 打包基础设施代码: 使用 TypeScript 编写可靠类库 使用 TypeScript ...
- Vue2.5 Web App 项目搭建 (TypeScript版)
参考了几位同行的Blogs和StackOverflow上的许多问答,在原来的ng1加TypeScript以及Webpack的经验基础上,搭建了该项目,核心文件如下,供需要的人参考. package.j ...
- TypeScript学习笔记(八) - 声明文件
本篇将介绍TypeScript的声明文件,并简单演示一下如何编写和使用声明文件.本篇也是这个系列的最后一篇. 一.声明文件简介 TypeScript作为JavaScript的超集,在开发过程中不可避免 ...
- 转载 《TypeScript 类型定义 DefinitelyTyped》
快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中. <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...
- .NET手撸绘制TypeScript类图——下篇
.NET手撸绘制TypeScript类图--下篇 在上篇的文章中,我们介绍了如何使用.NET解析TypeScript,这篇将介绍如何使用代码将类图渲染出来. 注:以防有人错过了,上篇链接如下:http ...
- TypeScript: Angular 2 的秘密武器(译)
本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...
随机推荐
- #3144. 「APIO 2019」奇怪装置
#3144. 「APIO 2019」奇怪装置 题目描述 考古学家发现古代文明留下了一种奇怪的装置.该装置包含两个屏幕,分别显示两个整数 \(x\) 和 \(y\). 经过研究,科学家对该装置得出了一个 ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 3
18.3 PDO的安装 PDO随PHP 5.1版本发行,在PHP 5的PECL扩展中也可以使用.PDO需要PHP 5版本核心面向对象特性的支持,所以它无法在之前的PHP版本中运行.无论如何,在配置P ...
- C#上手练习1(if语句、Swich语句)
1.打印字符串. 2.调用简单方法,方法里有if语句.Swich语句. C# if else 语句是最常用的条件语句,并且 if else 语句的形式有多种,包括单一条件的 if 语句.二选一条件的 ...
- 使用c#创建Excel 2013外接程序
心好累,印象笔记国内版和国际版账号还不能通用,在国内版写了一个没法创建共享链接(只有共享给XXemail),于是又写了一遍到国际版上(因为图片无法复制,又copy了一遍图片),现在copy到博客园,图 ...
- VS2017 打开WebService 提示已经在解决方案中打开了具有该名称的项目
.net开发.用VS2017工具,打开VS2010创建的WebSevice工程时,提示工程不可用. 重新加载后提示:已经在解决方案中打开了具有该名称的项目. 该问题原因是因为启用了源代码管理工具的问题 ...
- ucoreOS_lab4 实验报告
所有的实验报告将会在 Github 同步更新,更多内容请移步至Github:https://github.com/AngelKitty/review_the_national_post-graduat ...
- ABP进阶教程3 - 优化编辑
点这里进入ABP进阶教程目录 我们尝试在新增/编辑界面增加一个下拉框用来代替输入框编辑Status 添加实体 打开领域层(即JD.CRS.Core)的Entitys目录 //用以存放实体对象添加一个类 ...
- Node.js实现热加载
不管是node.js原生开发,还是借助express,kora等框架开发node.js的情况下,在对代码做出更新后,都是需要重启已生效我们的文件的. 本文记录一次在原生node.js开发的时候,为项目 ...
- Scala字符穿插值器
从2.10.0版本开始,Scala提供了三种创新的字符串插值方法: s.f 和 raw 于2.11.0版本开始,用于模式匹配patter match中 小结: s: s"Hello, $na ...
- python爬虫(3)——用户和IP代理池、抓包分析、异步请求数据、腾讯视频评论爬虫
用户代理池 用户代理池就是将不同的用户代理组建成为一个池子,随后随机调用. 作用:每次访问代表使用的浏览器不一样 import urllib.request import re import rand ...