TypeScript vs. C#: LINQ

TypeScript vs. C#: LINQ

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

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],  });
}

水平有限,请你们见谅,翻译的有误,请指出。谢谢post

原文地址 https://decembersoft.com/posts/typescript-vs-csharp-linq/ui