TypeScript vs. C#: LINQ

TypeScript 没有等效于 LINQ 的语言集成自然查询方面?不能在 TypeScript 中写入以下 LINQ 语句

1
var adultUserNames =  from 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的更多相关文章

  1. 一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。

    前言 TypeScript 是一种由微软开发的自由和开源的编程语言.它是JavaScript的一个超集,而且本质上向这个语言添加了可选的静态类型和基于类的面向对象编程.安德斯·海尔斯伯格,C#的首席架 ...

  2. ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript 。

    一个简单的 ASP.NET MVC 例子演示如何在 Knockout JS 的配合下,使用 TypeScript . 前言 TypeScript 是一种由微软开发的自由和开源的编程语言.它是JavaS ...

  3. 从C#到TypeScript - 类型

    总目录 从C#到TypeScript - 类型 从C#到TypeScript - 高级类型 从C#到TypeScript - 变量 从C#到TypeScript - 接口 从C#到TypeScript ...

  4. 前端项目模块化的实践3:使用 TypeScript 的收益

    以下是关于前端项目模块化的实践,包含以下内容: 搭建 NPM 私有仓库管理源码及依赖: 使用 Webpack 打包基础设施代码: 使用 TypeScript 编写可靠类库 使用 TypeScript ...

  5. Vue2.5 Web App 项目搭建 (TypeScript版)

    参考了几位同行的Blogs和StackOverflow上的许多问答,在原来的ng1加TypeScript以及Webpack的经验基础上,搭建了该项目,核心文件如下,供需要的人参考. package.j ...

  6. TypeScript学习笔记(八) - 声明文件

    本篇将介绍TypeScript的声明文件,并简单演示一下如何编写和使用声明文件.本篇也是这个系列的最后一篇. 一.声明文件简介 TypeScript作为JavaScript的超集,在开发过程中不可避免 ...

  7. 转载 《TypeScript 类型定义 DefinitelyTyped》

    快速使用Romanysoft LAB的技术实现 HTML 开发Mac OS App,并销售到苹果应用商店中.   <HTML开发Mac OS App 视频教程> 土豆网同步更新:http: ...

  8. .NET手撸绘制TypeScript类图——下篇

    .NET手撸绘制TypeScript类图--下篇 在上篇的文章中,我们介绍了如何使用.NET解析TypeScript,这篇将介绍如何使用代码将类图渲染出来. 注:以防有人错过了,上篇链接如下:http ...

  9. TypeScript: Angular 2 的秘密武器(译)

    本文整理自Dan Wahlin在ng-conf上的talk.原视频地址: https://www.youtube.com/watch?v=e3djIqAGqZo 开场白 开场白主要分为三部分: 感谢了 ...

随机推荐

  1. webUploader的使用

    webUploader的使用记录 WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML ...

  2. Jenkins 在 Tomcat 运行访问路径设置

    问题 最近用 Tomcat 搭建了个 Jenkins ,但是访问的时候需要端口加 /jenkins/ 才能进行访问.我们是直接将 Jenkins.war 包放在 webapps下的. 我们想直接通过不 ...

  3. GO 基本语法——变量

    基本语法--变量 一.变量的使用 1.1 什么是变量 变量是为存储特定类型的值而提供给内存位置的名称.在go中声明变量有多种语法. 所以变量的本质就是一小块内存,用于存储数据,在程序运行过程中数值可以 ...

  4. git报错:failed to push some refs to 'git@github.com:JiangXiaoLiang1988/CustomerHandl

    一.错误信息 今天在使用git将代码上传到GitHub的时候报下面的错误: 以前上传代码的时候重来没有出现这种错误,在网上查找了半天终于找到原因了:github中的README.md文件不在本地代码目 ...

  5. C#测试对比不同类型的方法调用的性能

    一. 测试方法调用形式 1. 实例方法调用 2. 静态方法调用 3. 实例方法反射调用 4. 委托方法的Invoke调用 5. 委托方法的DynamicInvoke调用 6.委托方法的BeginInv ...

  6. 深入理解JVM,虚拟机类加载机制

    类加载过程概览 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括以下7个阶段: 加载(Loading) 验证(Verification) 准备(Preparation) 解析(Re ...

  7. android 电容屏(四):驱动调试之驱动程序分析篇 -- FocalTech

    本人用的触摸屏IC是FocalTech公司的ft5306,是一款i2c的电容屏多点触控芯片.对于它的整体驱动官方已经给了,我们就触摸屏和按键部分的代码做相关说明.说明其中应该注意的地方. 对于所有的i ...

  8. Git入门基础教程和SourceTree应用

    目录 一.Git的安装 1.1 图形化界面 1.2 命令行界面 二.本地仓库的创建与提交 2.1 图形化界面 2.1.1 首先在电脑上有一个空白目录 2.1.2 打开SourceTree 2.1.3 ...

  9. 无依赖单文件http-ftp文件服务器(py2)

    网上看到的东东,居然在很合适堡垒机上传下载文件的场景. 这个只能在python2版本上跑, 我更改了自定义端口. 下次再改写个py3版本的. #!/usr/bin/env python "& ...

  10. 设置了相对定位relative之后,改变top值,如何去掉多余空白?

    众所周知,relative和absolute有一个区别在于relative是相对自身定位,而absolute是相对于最近的定位父级定位,而此时的相对定位经过top值改变其在文档流中的位置之后,自身本来 ...