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
|
AggregateAllAnyAppendAverageCastConcatContainsCountDefaultIfEmptyDistinctElementAtElementAtOrDefaultEmptyExceptFirstFirstOrDefaultList.ForEachGroupByIntersectLastLastOrDefaultMaxMinOfTypeOrderBy / ThenByReverseSelectSelectManySingleSingleOrDefaultSkipSkipWhileSumTakeTakeWhileUnionWhereZip |
Aggregate
|
1
2
3
4
5
6
|
// C#var leftToRight = users.Aggregate(initialValue, (a, u) => /* ... */); // TypeScriptconst 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); // TypeScriptconst allReady = users.every(u => u.isReady); |
Any
|
1
2
3
4
5
|
// C#var isDirty = users.Any(u => u.IsDirty); // TypeScriptconst isDirty = users.some(u => u.isDirty); |
Append
|
1
2
3
4
5
|
// C#var allUsers = users.Append(oneMoreUser); // TypeScriptconst allUsers = [ ...users, oneMoreUser ]; |
Average
|
1
2
3
4
5
6
7
8
|
// C#var avgAge = users.Average(u => u.Age); // TypeScriptif (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>(); // TypeScriptconst 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); // TypeScriptconst allUsers = [ ...users, ...moreUsers ]; |
Contains
|
1
2
3
4
5
|
// C#var hasAdmin = users.Contains(admin); // TypeScriptconst hasAdmin = users.includes(admin); // Use a polyfill for IE support |
Count
|
1
2
3
4
5
|
// C#var n = users.Count(); // TypeScriptconst n = users.length; |
DefaultIfEmpty
|
1
2
3
4
5
|
// C#var nonEmptyUsers = Enumerable.DefaultIfEmpty(users); // TypeScriptconst nonEmptyUsers = users.length ? users : [ null ]; |
Distinct
|
1
2
3
4
5
|
// C#var uniqueNames = users.Select(u => u.Name).Distinct(); // TypeScriptconst 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); // TypeScriptif (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); // TypeScriptconst 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>(); // TypeScriptconst noUsers: User[] = [];const noUsers = [] as User[]; |
Except
|
1
2
3
4
5
6
7
8
|
// C#var maleUsers = users.Except(femaleUsers); // TypeScriptconst 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(); // TypeScriptif (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(); // TypeScriptconst first = users[0]; |
List.ForEach
|
1
2
3
4
5
|
// C#users.ToList().ForEach(u => /* ... */); // TypeScriptusers.forEach(u => /* ... */); |
GroupBy
|
1
2
3
4
5
6
7
8
9
|
// C#var usersByCountry = users.GroupBy(u => u.Country); // TypeScriptconst usersByCountry = users.reduce((ubc, u) =>({ ...ubc, [u.country]: [ ...(ubc[u.country] || []), u ],}),{}); |
Intersect
|
1
2
3
4
5
|
// C#var targetUsers = usersWhoClicked.Intersect(usersBetween25And45); // TypeScriptconst 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(); // TypeScriptif (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(); // TypeScriptconst last = users[users.length - 1]; |
Max
|
1
2
3
4
5
6
7
8
|
// C#var oldestAge = users.Max(u => u.Age); // TypeScriptif (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); // TypeScriptif (users.length < 1) { throw 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); // TypeScriptconst 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(); // TypeScriptconst backwards = users.reverse();// Caution: users is also reversed! 原数组也翻转了 |
Select
|
1
2
3
4
5
|
// C#var names = users.Select(u => u.Name); // TypeScriptconst names = users.map(u => u.name); |
SelectMany
|
1
2
3
4
5
|
// C#var phoneNumbers = users.SelectMany(u => u.PhoneNumbers); // TypeScriptconst phoneNumbers = users.reduce((pn, u) => [ ...pn, ...u.phoneNumbers ], []); |
Single
|
1
2
3
4
5
6
7
8
9
10
|
// C#var user = users.Single(); // TypeScriptif (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(); // TypeScriptconst user = users[0]; |
Skip
|
1
2
3
4
5
|
// C#var otherUsers = users.Skip(n); // TypeScriptconst otherUsers = users.filter((u, i) => i >= n); |
SkipWhile
|
1
2
3
4
5
6
7
|
// C#var otherUsers = users.SkipWhile(predicate); // TypeScriptlet 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); // TypeScriptif (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); // TypeScriptconst otherUsers = users.filter((u, i) => i < n); |
TakeWhile
|
1
2
3
4
5
6
7
|
// C#var otherUsers = users.TakeWhile(predicate); // TypeScriptlet 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); // TypeScriptconst 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); // TypeScriptconst 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 }); // TypeScriptconst 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 开场白 开场白主要分为三部分: 感谢了 ...
随机推荐
- IT兄弟连 HTML5教程 HTML5和HTML的关系
HTML5开发现在很火爆,是一门技术,更是一个概念.可以让我们的工作模式.交互模式以及对应用和游戏的体验有了翻天覆地的变化,很多人都知道HTML5这门技术,也常把HTML5读作H5(简称).其实一些外 ...
- 巧妙利用selenium中的JS操作来处理特殊的文本框
在使用selenium对页面进行相关操作时,有时候会遇到以下三种情况: 1.日期框:无法直接输入文本,必须要选择某一天的日期并点击才会填入文本框: 2.检索框:可以直接输入文本,但必须要点击根据输入的 ...
- LeetCode 71.简化路径
LeetCode 71.简化路径 题目描述: 以 Unix 风格给出一个文件的绝对路径,你需要简化它.或者换句话说,将其转换为规范路径.在 Unix 风格的文件系统中,一个点(.)表示当前目录本身:此 ...
- 纯js的统计图插件-统计图
第一次写博客,写的不到望大家见谅! 今天给大家分享一个纯js的插件(统计图),有知道的可以在下面评论一起谈论一下,刚学着的时候,我是看了好久才看懂的一个基本结构,到后来我才知道原来直接去原网站上找到复 ...
- 查询安装webpack4.0是否成功时提示无法找到的解决方法
最近使用webpack -v 查询webpack版本时提示无法找到 然后我试着重新全局安装webpack,提示还需要安装webpack-cli 选择yes后虽能成功安装webp ...
- 什么是SFP光模块?
什么是光模块? 光模块(optical module)由光电子器件.功能电路和光接口等组成,光电子器件包括发射和接收两部分.简单的说,光模块的作用就是光电转换,发送端把电信号转换成光信号,通过光纤传送 ...
- Flink中Idle停滞流机制(源码分析)
前几天在社区群上,有人问了一个问题 既然上游最小水印会决定窗口触发,那如果我上游其中一条流突然没有了数据,我的窗口还会继续触发吗? 看到这个问题,我蒙了???? 对哈,因为我是选择上游所有流中水印最小 ...
- FtpClient上传文件速度非常慢,而且大小为0,上传失败
问题发生: 环境:VSFTP+FTPClient+Client 使用FTPClient上传文件的时候总是卡住,而且文件大小为0,上传失败, 解决方案: 添加代码:调用FTPClient的enterLo ...
- wpf listview images
<ListView x:Name="lv"> <ListView.ItemsPanel> <ItemsPanelTemplate> <St ...
- 高强度学习训练第十天总结:Class文件
今天这Class文件看的我一脸懵圈.有种当初学PE时候的感觉了. 类文件结构 如果计算机的CPU指令集只有X86一种,操作系统也只有windows,那也许Java语言就不会出现.Java在诞生之初就提 ...