默听 發表於 2019-11-9 11:30:00

TypeScript vs. C#: LINQ

<p style="text-align: center">TypeScript vs. C#: LINQ</p>
<p>TypeScript 没有等效于 LINQ 的语言集成自然查询方面?不能在 TypeScript 中写入以下 LINQ 语句</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">var adultUserNames =from u in userswhere u.Age &gt;= 18select u.Name;
</pre>
</div>
<p>但是,位于 LINQ 核心的 iE6&lt;T&gt;扩展方法在 TypeScript 中具有等效项(或可以模拟)。</p>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">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
</pre>
</div>
<h3>Aggregate</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var leftToRight = users.Aggregate(initialValue, (a, u) =&gt; /* ... */);

// TypeScript
const leftToRight = users.reduce((a, u) =&gt; /* ... */, initialValue);
const rightToLeft = users.reduceRight((a, u) =&gt; /* ... */, initialValue);
</pre>
</div>
<h3>All</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var allReady = users.All(u =&gt; u.IsReady);

// TypeScrip
tconst allReady = users.every(u =&gt; u.isReady);
</pre>
</div>
<h3>Any</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var isDirty = users.Any(u =&gt; u.IsDirty);

// TypeScript
const isDirty = users.some(u =&gt; u.isDirty);
</pre>
</div>
<h3>Append</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var allUsers = users.Append(oneMoreUser);

// TypeScript
const allUsers = [ ...users, oneMoreUser ];</pre>
</div>
<h3>Average</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var avgAge = users.Average(u =&gt; u.Age);

// TypeScript
if (users.length &lt; 1) {
throw new Error('source contains no elements');
}
const avgAge = users.reduce((a, u) =&gt; a + u.age, 0) / users.length;</pre>
</div>
<h3>Cast</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var people = users.Cast&lt;Person&gt;();

// 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 的任何用户。 </pre>
</div>
<h3>Concat</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var allUsers = users.Concat(moreUsers);

// TypeScript
const allUsers = [ ...users, ...moreUsers ];</pre>
</div>
<h3>Contains</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var hasAdmin = users.Contains(admin);

// TypeScript
const hasAdmin = users.includes(admin); // Use a polyfill for IE support</pre>
</div>
<h3>Count</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var n = users.Count();

// TypeScript
const n = users.length;</pre>
</div>
<h3>DefaultIfEmpty</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var nonEmptyUsers = Enumerable.DefaultIfEmpty(users);

// TypeScript
const nonEmptyUsers = users.length ? users : [ null ]; </pre>
</div>
<h3>Distinct</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var uniqueNames = users.Select(u =&gt; u.Name).Distinct();

// TypeScript
const uniqueNames = Object.keys(users.map(u =&gt; u.name).reduce((un, u) =&gt; ({ ...un, n }),{}));</pre>
</div>
<h3>ElementAt</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var nth = users.ElementAt(n);

// TypeScript
if (n &lt; 0 || n &gt; users.length) {
throw new Error('Index was out of range');
}
const nth = users; </pre>
</div>
<h3>ElementAtOrDefault</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var nth = users.ElementAtOrDefault(n);

// TypeScript
const nth = users;</pre>
</div>
<h3>Empty</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var noUsers = IEnumerable.Empty&lt;User&gt;();//?.NET 4.0 没找到 找到的是DefaultIfEmpty
//
var noUsers = IEnumerable.DefaultIfEmpty&lt;User&gt;();

// TypeScript
const noUsers: User[] = [];
const noUsers = [] as User[];</pre>
</div>
<h3>Except</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var maleUsers = users.Except(femaleUsers);

// TypeScript
const maleUsers = users.filter
(
u =&gt;!femaleUsers.includes(u) // Use a polyfill for IE support(Use a polyfill for IE support)
); </pre>
</div>
<h3>First</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var first = users.First();

// TypeScript
if (users.length &lt; 1) {
throw new Error('Sequence contains no elements');
}
const first = users;</pre>
</div>
<h3>FirstOrDefault</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var first = users.FirstOrDefault();

// TypeScript
const first = users;</pre>
</div>
<h3>List.ForEach</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
users.ToList().ForEach(u =&gt; /* ... */);

// TypeScript
users.forEach(u =&gt; /* ... */);</pre>
</div>
<h3>GroupBy</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var usersByCountry = users.GroupBy(u =&gt; u.Country);

// TypeScript
const usersByCountry = users.reduce((ubc, u) =&gt;
({
...ubc,
: [ ...(ubc || []), u ],}),
{});</pre>
</div>
<h3>Intersect</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var targetUsers = usersWhoClicked.Intersect(usersBetween25And45);

// TypeScript
const targetUsers = usersWhoClicked.filter(u =&gt;usersBetween25And45.includes(u) // Use a polyfill for IE support);</pre>
</div>
<h3>Last</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var last = users.Last();

// TypeScrip
tif (users.length &lt; 1) {
throw new Error('Sequence contains no elements');
}
const last = users;</pre>
</div>
<h3>LastOrDefault</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var last = users.LastOrDefault();

// TypeScript
const last = users;</pre>
</div>
<h3>Max</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var oldestAge = users.Max(u =&gt; u.Age);

// TypeScrip
tif (users.length &lt; 1) {
throw new Error('source contains no elements');
}
const oldestAge = users.reduce((oa, u) =&gt; Math.max(oa, u.age), 0);</pre>
</div>
<h3>Min</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var youngestAge = users.Min(u =&gt; u.Age);

// TypeScript
if (users.length &lt; 1) {t
hrow new Error('source contains no elements');
}
const youngestAge = users.reduce((ya, u) =&gt; Math.min(ya, u.age), Number.MAX_VALUE);</pre>
</div>
<h3>OfType</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var bots = users.OfType&lt;Bot&gt;();//根据类型刷新元素

// TypeScript
// No equivalent   无等效项</pre>
</div>
<h3>OrderBy / ThenBy</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var sorted = users.OrderBy(u =&gt; u.Age).ThenBy(u =&gt; u.Name);

// TypeScript
const sorted = users.sort((a, b) =&gt; {
const ageDiff = b.age - a.age;
if (ageDiff)
return ageDiff;
return a.name.localeCompare(b.name);
// Use a polyfill for IE support
}
);</pre>
</div>
<h3>Reverse</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var backwards = users.Reverse();

// TypeScript
const backwards = users.reverse();// Caution: users is also reversed! 原数组也翻转了</pre>
</div>
<h3>Select</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var names = users.Select(u =&gt; u.Name);

// TypeScript
const names = users.map(u =&gt; u.name);  </pre>
</div>
<h3>SelectMany</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var phoneNumbers = users.SelectMany(u =&gt; u.PhoneNumbers);

// TypeScript
const phoneNumbers = users.reduce((pn, u) =&gt; [ ...pn, ...u.phoneNumbers ], []); </pre>
</div>
<h3>Single</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var user = users.Single();

// TypeScript
if (users.length &gt; 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;</pre>
</div>
<h3>SingleOrDefault</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var user = users.Single();

// TypeScript
const user = users; </pre>
</div>
<h3>Skip</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var otherUsers = users.Skip(n);

// TypeScript
const otherUsers = users.filter((u, i) =&gt; i &gt;= n); </pre>
</div>
<h3>SkipWhile</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var otherUsers = users.SkipWhile(predicate);

// TypeScript
let i = 0;
while (i &lt; users.length &amp;&amp; predicate(users));
   const otherUsers = users.slice(i - 1); </pre>
</div>
<h3>Sum</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var totalYears = users.Sum(u =&gt; u.Age);

// TypeScript
if (users.length &lt; 1) {
throw new Error('source contains no elements');
}
const totalYears = users.reduce((ty, u) =&gt; ty + u, 0);</pre>
</div>
<h3>Take</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var otherUsers = users.Take(n);

// TypeScript
const otherUsers = users.filter((u, i) =&gt; i &lt; n);</pre>
</div>
<h3>TakeWhile</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var otherUsers = users.TakeWhile(predicate);

// TypeScript
let i = 0;
while (i &lt; users.length &amp;&amp; predicate(users));
const otherUsers = users.slice(0, i - 1); </pre>
</div>
<h3>Union</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var allUsers = someUser.Union(otherUsers);

// TypeScript
const allUsers = otherUsers.reduce((au, u) =&gt;
au.includes(u)? au    : [ ...au, u ]}), someUsers));// Use a polyfill for IE support</pre>
</div>
<h3>Where</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var adults = users.Where(u =&gt; u.Age &gt;= 18);

// TypeScript
const adults = users.filter(u =&gt; u.age &gt;= 18); </pre>
</div>
<h3>Zip</h3>
<div class="cnblogs_Highlighter">
<pre class="brush:csharp;gutter:true;">// C#
var matches = buyers.Zip(sellers, (b, s) =&gt; new { Buyer = b, Seller = s });

// TypeScript
const matches = []
;for (let i = 0; i &lt; buyers.length &amp;&amp; i &lt; sellers.length; i++) {
matches.push({    buyer: buyers,    seller: sellers,});
}
</pre>
</div>
<p>水平有限,请大家见谅,翻译的有误,请指出。谢谢</p>
<p>原文地址&nbsp;https://decembersoft.com/posts/typescript-vs-csharp-linq/</p>
<p>  </p>
<p>    </p><br><br>
来源:https://www.cnblogs.com/zhongzw/p/11824821.html
頁: [1]
查看完整版本: TypeScript vs. C#: LINQ