<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: .NET</title><link>https://academy.hsoub.com/programming/c-sharp/dotnet/page/2/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: .NET</description><language>ar</language><item><title>&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x633;&#x62A;&#x639;&#x644;&#x627;&#x645;&#x627;&#x62A; LINQ &#x641;&#x64A; dot NET</title><link>https://academy.hsoub.com/programming/c-sharp/dotnet/%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D8%B3%D8%AA%D8%B9%D9%84%D8%A7%D9%85%D8%A7%D8%AA-linq-%D9%81%D9%8A-dot-net-r948/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_07/6.png.a60a8ce9b6fd797dafc1fe869e3eaca1.png" /></p>

<p>
	الاستعلامات التكميلية اللغوية (Language Integrated Query - LINQ) هي تَعبيرات برمجية (expressions)، تَجلْب بيانات مُعينة من مَصدر بيانات (data source). تُوفِر استعلامات LINQ نَموذج مُتجانِس لتسهيل التعامل مع البيانات من مُختَلَف أنواع وصِيغْ مصادر البيانات (data sources). عند استخدامك لاستعلامات LINQ، فأنت دومًا تتعامل مع كائنات (objects)، وتَستَخدِم نفس الأنماط البرمجية الأساسية لجَلْب وتَغيير البيانات سواء كانت مُخزَّنة بملفات XML، أو بقواعد البيانات SQL، أو تقنية ADO.NET أو تَجمِيعَات ‎.NET، أو أيّ صيغْْة أخرى مُتاح لها مُوفِّر (provider). يُمكن استخدام LINQ بلغتي C#‎ و VB.
</p>

<h2>
	التابع SelectMany (ربط مسطح flat map)
</h2>

<p>
	لكل عنصر دخْل، يُعِيد التابع <a href="https://msdn.microsoft.com/en-us/library/bb548891(v=vs.100).aspx" rel="external nofollow">Enumerable.Select</a> عنصر خْرج وحيد مُناظِر. في المقابل، يُسمَح للتابع <a href="https://msdn.microsoft.com/en-us/library/bb534336(v=vs.100).aspx" rel="external nofollow">Enumerable.SelectMany</a> بإعادة أيّ عدد مُناظِر من عناصر الخْرج. بالتالي، قد يكون عدد عناصر مُتتالِية الخْرج مِن التابع <code>SelectMany</code> غَيْر مُساو لعدد عناصر مُتتالية الدخْل.
</p>

<p>
	تُمرَّر دالة مُجردة (Lambda expression) لكِلا التابعين، وينبغي لتلك الدالة إعادة عدد من القيم بما يتوافق مع ما ذُكِر بالأعلى.
</p>

<p>
	مثال:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_7" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Invoice</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Customer</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Invoice</span><span class="pun">[]</span><span class="pln"> </span><span class="typ">Invoices</span><span class="pln"> </span><span class="pun">{</span><span class="pln">get</span><span class="pun">;</span><span class="typ">set</span><span class="pun">;}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


var customers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Customer</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Invoices</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Invoice</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pun">=</span><span class="lit">1</span><span class="pun">},</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Invoice</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pun">=</span><span class="lit">2</span><span class="pun">},</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Customer</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Invoices</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Invoice</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pun">=</span><span class="lit">3</span><span class="pun">},</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Invoice</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pun">=</span><span class="lit">4</span><span class="pun">},</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Customer</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Invoices</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Invoice</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pun">=</span><span class="lit">5</span><span class="pun">},</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Invoice</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pun">=</span><span class="lit">6</span><span class="pun">},</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var allInvoicesFromAllCustomers </span><span class="pun">=</span><span class="pln"> customers</span><span class="pun">.</span><span class="typ">SelectMany</span><span class="pun">(</span><span class="pln">c </span><span class="pun">=&gt;</span><span class="pln"> c</span><span class="pun">.</span><span class="typ">Invoices</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">
    string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> allInvoicesFromAllCustomers</span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=&gt;</span><span class="pln"> i</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">).</span><span class="typ">ToArray</span><span class="pun">()));</span></pre>

<p>
	الخْرج:
</p>

<pre class="ipsCode">
1,2,3,4,5,6
</pre>

<p>
	<a href="https://dotnetfiddle.net/XKGtBr" rel="external nofollow">مِثال حي</a>
</p>

<p>
	يُمكن للاستعلام المُعتمِد على الصيغة (syntax-based query) تَنفيذ مُهمة التابع <code>Enumerable.SelectMany</code> باستخدام عِبارتي <code>from</code> متتاليتين كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_13" style="">
<span class="pln">var allInvoicesFromAllCustomers
    </span><span class="pun">=</span><span class="pln"> from customer in customers
    from invoice in customer</span><span class="pun">.</span><span class="typ">Invoices</span><span class="pln">
    select invoice</span><span class="pun">;</span></pre>

<h2>
	التابع Where (تَرشِيح filter)
</h2>

<p>
	يُعيد التابع <code>Where</code> مُُعدَّد من الواجهة <code>IEnumerable</code>، والذي يَحوِي جميع العناصر التي تُحقِق شرط الدالة المُجردة (lambda expression) المُمرَّرة.
</p>

<p>
	مِثال:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_15" style="">
<span class="pln">var personNames </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="str">"Foo"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Bar"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Fizz"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Buzz"</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var namesStartingWithF </span><span class="pun">=</span><span class="pln"> personNames</span><span class="pun">.</span><span class="typ">Where</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">StartsWith</span><span class="pun">(</span><span class="str">"F"</span><span class="pun">));</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> namesStartingWithF</span><span class="pun">));</span></pre>

<p>
	الخْرج:
</p>

<pre class="ipsCode">
Foo,Fizz
</pre>

<p>
	<a href="https://dotnetfiddle.net/nTbZI0" rel="external nofollow">مِثال حي</a>
</p>

<h2>
	التابع Any
</h2>

<p>
	يُعيد التابع <code>Any</code> القيمة المنطقية <code>true</code> إذا حَوَت التَجمِيعَة أيّة عناصر تُحقِق شرط الدالة المُجردة (lambda expression) المُمرَّرة. انظر المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_17" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">


var isNotEmpty </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Any</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">isNotEmpty</span><span class="pun">);</span><span class="pln"> </span><span class="com">//True</span><span class="pln">


var anyNumberIsOne </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Any</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">anyNumberIsOne</span><span class="pun">);</span><span class="pln"> </span><span class="com">//True</span><span class="pln">


var anyNumberIsSix </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Any</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">==</span><span class="pln"> </span><span class="lit">6</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">anyNumberIsSix</span><span class="pun">);</span><span class="pln"> </span><span class="com">//False</span><span class="pln">


var anyNumberIsOdd </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Any</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">anyNumberIsOdd</span><span class="pun">);</span><span class="pln"> </span><span class="com">//True</span><span class="pln">


var anyNumberIsNegative </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Any</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">anyNumberIsNegative</span><span class="pun">);</span><span class="pln"> </span><span class="com">//False</span></pre>

<h2>
	التابع GroupJoin
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_19" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Developer</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Project</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">DeveloperId</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


var developers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Developer</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Foobuzz"</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Developer</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Barfizz"</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var projects </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Project</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">DeveloperId</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello World 3D"</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Project</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">DeveloperId</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Super Fizzbuzz Maker"</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Project</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">DeveloperId</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Citizen Kane - The action game"</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Project</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">DeveloperId</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Pro Pong 2016"</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var grouped </span><span class="pun">=</span><span class="pln"> developers</span><span class="pun">.</span><span class="typ">GroupJoin</span><span class="pun">(</span><span class="pln">
    inner</span><span class="pun">:</span><span class="pln"> projects</span><span class="pun">,</span><span class="pln">
    outerKeySelector</span><span class="pun">:</span><span class="pln"> dev </span><span class="pun">=&gt;</span><span class="pln"> dev</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">,</span><span class="pln">
    innerKeySelector</span><span class="pun">:</span><span class="pln"> proj </span><span class="pun">=&gt;</span><span class="pln"> proj</span><span class="pun">.</span><span class="typ">DeveloperId</span><span class="pun">,</span><span class="pln">
    resultSelector</span><span class="pun">:</span><span class="pln">
    </span><span class="pun">(</span><span class="pln">dev</span><span class="pun">,</span><span class="pln"> projs</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">DeveloperName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> dev</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">ProjectNames</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> projs</span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">).</span><span class="typ">ToArray</span><span class="pun">()});</span><span class="pln">
foreach</span><span class="pun">(</span><span class="pln">var item in grouped</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">
        </span><span class="str">"{0}'s projects: {1}"</span><span class="pun">,</span><span class="pln">
        item</span><span class="pun">.</span><span class="typ">DeveloperName</span><span class="pun">,</span><span class="pln">
        string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">", "</span><span class="pun">,</span><span class="pln"> item</span><span class="pun">.</span><span class="typ">ProjectNames</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


</span><span class="com">//Foobuzz's projects: Hello World 3D, Super Fizzbuzz Maker</span><span class="pln">
</span><span class="com">//Barfizz's projects: Citizen Kane - The action game, Pro Pong 2016</span></pre>

<h2>
	التابع Except
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_21" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
var evenNumbersBetweenSixAndFourteen </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">12</span><span class="pln"> </span><span class="pun">};</span><span class="pln">


var result </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Except</span><span class="pun">(</span><span class="pln">evenNumbersBetweenSixAndFourteen</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> result</span><span class="pun">));</span><span class="pln">
</span><span class="com">//1, 2, 3, 4, 5, 7, 9</span></pre>

<h2>
	التابع Zip
</h2>

<p>
	بِدءًا من الإصدار 4.0 أو أحدث.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_23" style="">
<span class="pln">var tens </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">10</span><span class="pun">,</span><span class="lit">20</span><span class="pun">,</span><span class="lit">30</span><span class="pun">,</span><span class="lit">40</span><span class="pun">,</span><span class="lit">50</span><span class="pun">};</span><span class="pln">
var units </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">


var sums </span><span class="pun">=</span><span class="pln"> tens</span><span class="pun">.</span><span class="typ">Zip</span><span class="pun">(</span><span class="pln">units</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">first</span><span class="pun">,</span><span class="pln"> second</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> first </span><span class="pun">+</span><span class="pln"> second</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> sums</span><span class="pun">));</span><span class="pln">
</span><span class="com">//11,22,33,44,55</span></pre>

<h2>
	التابع Aggregate (طوي fold)
</h2>

<p>
	يَستقبِل التابع <code>Aggregate</code> المُعامِل <code>seed</code>، الذي يَحوِي قيمة التهيئة للمُراكِم (accumulator). في حالة تمرير سلسلة نصية كالمثال التالي، سيُنشَّئ كائن جديد مع كل خطوة أي بِعَدَد عناصر المُعدَّد.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_25" style="">
<span class="pln">var elements </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">


var commaSeparatedElements </span><span class="pun">=</span><span class="pln"> elements</span><span class="pun">.</span><span class="typ">Aggregate</span><span class="pun">(</span><span class="pln">
    seed</span><span class="pun">:</span><span class="pln"> </span><span class="str">""</span><span class="pun">,</span><span class="pln">
    func</span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="pln">aggregate</span><span class="pun">,</span><span class="pln"> element</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $</span><span class="str">"{aggregate}{element},"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">commaSeparatedElements</span><span class="pun">);</span><span class="pln">
</span><span class="com">//1,2,3,4,5,</span></pre>

<p>
	لاستخدام نفس الكائن بجميع الخطوات، مَرِّر كائنًا من النوع <code>StringBuilder</code> للمُعامِل <code>seed</code> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_27" style="">
<span class="pln">var commaSeparatedElements2 </span><span class="pun">=</span><span class="pln"> elements</span><span class="pun">.</span><span class="typ">Aggregate</span><span class="pun">(</span><span class="pln">
    seed</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StringBuilder</span><span class="pun">(),</span><span class="pln">
    func</span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="pln">seed</span><span class="pun">,</span><span class="pln"> element</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> seed</span><span class="pun">.</span><span class="typ">Append</span><span class="pun">(</span><span class="pln">$</span><span class="str">"{element},"</span><span class="pun">));</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">commaSeparatedElements2</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">());</span><span class="pln">
</span><span class="com">//1,2,3,4,5,</span></pre>

<p>
	يَتحكَم المُعامِل <code>resultSelector</code> بصيغة الخْرج:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_29" style="">
<span class="pln">var commaSeparatedElements3 </span><span class="pun">=</span><span class="pln"> elements</span><span class="pun">.</span><span class="typ">Aggregate</span><span class="pun">(</span><span class="pln">
    seed</span><span class="pun">:</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StringBuilder</span><span class="pun">(),</span><span class="pln">
    func</span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="pln">seed</span><span class="pun">,</span><span class="pln"> element</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> seed</span><span class="pun">.</span><span class="typ">Append</span><span class="pun">(</span><span class="pln">$</span><span class="str">"{element},"</span><span class="pun">),</span><span class="pln">
    resultSelector</span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="pln">seed</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> seed</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">());</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">commaSeparatedElements3</span><span class="pun">);</span><span class="pln"> </span><span class="com">//1,2,3,4,5,</span></pre>

<p>
	إذا لم تُمَرَّر قيمة للمُعامِل <code>seed</code>، تؤول قيمته بشكل افتراضي لأول عنصر بالمُعدَّد.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_31" style="">
<span class="pln">var seedAndElements </span><span class="pun">=</span><span class="pln"> elements</span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">n</span><span class="pun">=&gt;</span><span class="pln">n</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">());</span><span class="pln">
var commaSeparatedElements4 </span><span class="pun">=</span><span class="pln"> seedAndElements</span><span class="pun">.</span><span class="typ">Aggregate</span><span class="pun">(</span><span class="pln">
    func</span><span class="pun">:</span><span class="pln"> </span><span class="pun">(</span><span class="pln">aggregate</span><span class="pun">,</span><span class="pln"> element</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $</span><span class="str">"{aggregate}{element},"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">commaSeparatedElements4</span><span class="pun">);</span><span class="pln">
</span><span class="com">//12,3,4,5,</span></pre>

<h2>
	التابع ToLookup
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_33" style="">
<span class="pln">var persons </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Fizz"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Job</span><span class="pun">=</span><span class="str">"Developer"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Buzz"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Job</span><span class="pun">=</span><span class="str">"Developer"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Foo"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Job</span><span class="pun">=</span><span class="str">"Astronaut"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Bar"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Job</span><span class="pun">=</span><span class="str">"Astronaut"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var groupedByJob </span><span class="pun">=</span><span class="pln"> persons</span><span class="pun">.</span><span class="typ">ToLookup</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Job</span><span class="pun">);</span><span class="pln">


foreach</span><span class="pun">(</span><span class="pln">var theGroup in groupedByJob</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">
        </span><span class="str">"{0} are {1}s"</span><span class="pun">,</span><span class="pln">
        string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> theGroup</span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">g </span><span class="pun">=&gt;</span><span class="pln"> g</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">).</span><span class="typ">ToArray</span><span class="pun">()),</span><span class="pln">
        theGroup</span><span class="pun">.</span><span class="typ">Key</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


</span><span class="com">//Fizz,Buzz are Developers</span><span class="pln">
</span><span class="com">//Foo,Bar are Astronauts</span></pre>

<h2>
	التابع Intersect
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_35" style="">
<span class="pln">var numbers1to10 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">7</span><span class="pun">,</span><span class="lit">8</span><span class="pun">,</span><span class="lit">9</span><span class="pun">,</span><span class="lit">10</span><span class="pun">};</span><span class="pln">
var numbers5to15 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">5</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">7</span><span class="pun">,</span><span class="lit">8</span><span class="pun">,</span><span class="lit">9</span><span class="pun">,</span><span class="lit">10</span><span class="pun">,</span><span class="lit">11</span><span class="pun">,</span><span class="lit">12</span><span class="pun">,</span><span class="lit">13</span><span class="pun">,</span><span class="lit">14</span><span class="pun">,</span><span class="lit">15</span><span class="pun">};</span><span class="pln">


var numbers5to10 </span><span class="pun">=</span><span class="pln"> numbers1to10</span><span class="pun">.</span><span class="typ">Intersect</span><span class="pun">(</span><span class="pln">numbers5to15</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> numbers5to10</span><span class="pun">));</span><span class="pln">


</span><span class="com">//5,6,7,8,9,10</span></pre>

<h2>
	التابع Concat
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_37" style="">
<span class="pln">var numbers1to5 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">};</span><span class="pln">
var numbers4to8 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">};</span><span class="pln">


var numbers1to8 </span><span class="pun">=</span><span class="pln"> numbers1to5</span><span class="pun">.</span><span class="typ">Concat</span><span class="pun">(</span><span class="pln">numbers4to8</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> numbers1to8</span><span class="pun">));</span><span class="pln">


</span><span class="com">//1,2,3,4,5,4,5,6,7,8</span></pre>

<p>
	يحتفظ التابع <code>Concat</code> بالعناصر المُكرّرة دون حَذفِها. اِستخدِم التابع <code>Union</code> إذا لم يكن ذلك ما ترغب به.
</p>

<h2>
	التابع All
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_39" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
var allNumbersAreOdd </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">All</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">allNumbersAreOdd</span><span class="pun">);</span><span class="pln"> </span><span class="com">//False</span><span class="pln">


var allNumbersArePositive </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">All</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">allNumbersArePositive</span><span class="pun">);</span><span class="pln"> </span><span class="com">//True</span></pre>

<p>
	يُعيِد التابع <code>All</code> القيمة المنطقية <code>false</code> فقط عندما يجد عنصرًا بالمُعدَّد لا يُحقق شرط الدالة المُجردة (lambda expression). بالتالي، إذا كان المُعدَّد فارغًا، سيُعيد التابع القيمة المنطقية <code>true</code> دومًا بغض النظر عن شرط الدالة المجردة، كالمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_41" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">int</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">
var allNumbersArePositive </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">All</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">allNumbersArePositive</span><span class="pun">);</span><span class="pln"> </span><span class="com">//True</span></pre>

<h2>
	التابع Sum
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_43" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">};</span><span class="pln">


var sumOfAllNumbers </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Sum</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">sumOfAllNumbers</span><span class="pun">);</span><span class="pln"> </span><span class="com">//10</span><span class="pln">


var cities </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Population</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Population</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2500</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Population</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4000</span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var totalPopulation </span><span class="pun">=</span><span class="pln"> cities</span><span class="pun">.</span><span class="typ">Sum</span><span class="pun">(</span><span class="pln">c </span><span class="pun">=&gt;</span><span class="pln"> c</span><span class="pun">.</span><span class="typ">Population</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">totalPopulation</span><span class="pun">);</span><span class="pln"> </span><span class="com">//7500</span></pre>

<h2>
	التابع SequenceEqual
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_45" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
var sameNumbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
var sameNumbersInDifferentOrder </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">5</span><span class="pun">,</span><span class="lit">1</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">};</span><span class="pln">


var equalIfSameOrder </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">SequenceEqual</span><span class="pun">(</span><span class="pln">sameNumbers</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">equalIfSameOrder</span><span class="pun">);</span><span class="pln"> </span><span class="com">//True</span><span class="pln">


var equalIfDifferentOrder </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">SequenceEqual</span><span class="pun">(</span><span class="pln">sameNumbersInDifferentOrder</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">equalIfDifferentOrder</span><span class="pun">);</span><span class="pln"> </span><span class="com">//False</span></pre>

<h2>
	التابع Min
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_47" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">};</span><span class="pln">


var minNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Min</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">minNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//1</span><span class="pln">


var cities </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Population</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Population</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2500</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Population</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4000</span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var minPopulation </span><span class="pun">=</span><span class="pln"> cities</span><span class="pun">.</span><span class="typ">Min</span><span class="pun">(</span><span class="pln">c </span><span class="pun">=&gt;</span><span class="pln"> c</span><span class="pun">.</span><span class="typ">Population</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">minPopulation</span><span class="pun">);</span><span class="pln"> </span><span class="com">//1000</span></pre>

<h2>
	التابع Distinct
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_49" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">};</span><span class="pln">
var distinctNumbers </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Distinct</span><span class="pun">();</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> distinctNumbers</span><span class="pun">));</span><span class="pln">


</span><span class="com">//1,2,3,4,5</span></pre>

<h2>
	التابع Count
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_51" style="">
<span class="typ">IEnumerable</span><span class="str">&lt;int&gt;</span><span class="pln"> numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">7</span><span class="pun">,</span><span class="lit">8</span><span class="pun">,</span><span class="lit">9</span><span class="pun">,</span><span class="lit">10</span><span class="pun">};</span><span class="pln">


var numbersCount </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">numbersCount</span><span class="pun">);</span><span class="pln"> </span><span class="com">//10</span><span class="pln">


var evenNumbersCount </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">evenNumbersCount</span><span class="pun">);</span><span class="pln"> </span><span class="com">//5</span></pre>

<h2>
	التابع Cast
</h2>

<p>
	يَختلف التابع <code>Cast</code> عن بقية توابع النوع <code>Enumerable</code> من جِهة كَوْنه تابعًا مُوسِّعًا للواجهة <code>IEnumerable</code> لا نظيرتها المُعمَّمة <code>IEnumerable&lt;T&gt;‎</code>. بالتالي، قد يُستَخَدم لتحويل نُسخ من الواجهة غير المُعمَّمة لآخرى مُعمَّمة.
</p>

<p>
	فمثلًا، لا يجتاز المثال التالي عملية التَصرِّيف (compilation)؛ نظرًا لأن التابع <code>First</code> -كغالبية توابع النوع <code>Enumerable</code>- هو تابِع موسِّع للواجهة <code>IEnumerable&lt;T&gt;‎</code>، ولمّا كان النوع <code>ArrayList</code> لا يُنَفِذ تلك الوَاجِهة وإنما يُنَفِذ الواجهة غيْر المُعمَّمة <code>IEnumerable</code>، تَفشل عملية التَصرِّيف.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_53" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">numbers</span><span class="pun">.</span><span class="typ">First</span><span class="pun">());</span></pre>

<p>
	في المُقابِل، يَعمل المثال التالي بشكل سليم:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_55" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ArrayList</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">numbers</span><span class="pun">.</span><span class="typ">Cast</span><span class="str">&lt;int&gt;</span><span class="pun">().</span><span class="typ">First</span><span class="pun">());</span><span class="pln"> </span><span class="com">//1</span></pre>

<p>
	لا يُجرِي التابع <code>Cast</code> عملية التحويل بين اﻷنواع (Casting). فمثلًا، في حين تجتاز الشيفرة التالية عملية التَصرِّيف (compilation)، يُبلَّغ عن اعتراض من النوع <code>InvalidCastException</code> خلال زمن التشغيل (runtime).
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_57" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">int</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
decimal</span><span class="pun">[]</span><span class="pln"> numbersAsDecimal </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Cast</span><span class="str">&lt;decimal&gt;</span><span class="pun">().</span><span class="typ">ToArray</span><span class="pun">();</span></pre>

<p>
	إذا أردت إجراء عملية التحويل بين الأنواع (casting) على التَجميعَات بطريقة صحيحة، نفذ التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_59" style="">
<span class="pln">var numbers</span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">int</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
decimal</span><span class="pun">[]</span><span class="pln"> numbersAsDecimal </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">decimal</span><span class="pun">)</span><span class="pln">n</span><span class="pun">).</span><span class="typ">ToArray</span><span class="pun">();</span></pre>

<h2>
	التابع Range
</h2>

<p>
	يَستقبِل التابع <code>Range</code> مُعامِلين، هما قيمة أول رقم بالمُُعدَّد، ورقم يُعبِر عن عدد العناصر بالمُعَّدد النَاتِج -لا قيمة آخر رقم.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_61" style="">
<span class="com">// prints 1,2,3,4,5,6,7,8,9,10</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Enumerable</span><span class="pun">.</span><span class="typ">Range</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">)));</span><span class="pln">


</span><span class="com">// prints 10,11,12,13,14</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Enumerable</span><span class="pun">.</span><span class="typ">Range</span><span class="pun">(</span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">)));</span></pre>

<h2>
	التابع ThenBy
</h2>

<p>
	لا يُستخَدَم التابع <code>ThenBy</code> إلا بعد استدعاء التابع <code>OrderBy</code>، مما يَسمَح بترتيب عناصر المُُعدَّد وفقًا لأكثر من معيار.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_63" style="">
<span class="pln">var persons
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Foo"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Order</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"FooTwo"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Order</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Bar"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Order</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"BarTwo"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Order</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Fizz"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Order</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"FizzTwo"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Order</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var personsSortedByName </span><span class="pun">=</span><span class="pln"> persons</span><span class="pun">.</span><span class="typ">OrderBy</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">).</span><span class="typ">ThenBy</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Order</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> personsSortedByName</span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">)));</span><span class="pln">


</span><span class="com">//This will display :</span><span class="pln">
</span><span class="com">//Foo,FooTwo,BarTwo,Bar,FizzTwo,Fizz</span></pre>

<h2>
	التابع Repeat
</h2>

<p>
	يُعيد التابع <code>Enumerable.Repeat</code> مُتتالية من عدة عناصر تَحمِل جميعها نفس القيمة. يُنتج المثال التالي مُتتالية مكونة من أربع عناصر، يَحوي كلَا منها السلسلة النصية “Hello”.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_65" style="">
<span class="pln">var repeats </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Enumerable</span><span class="pun">.</span><span class="typ">Repeat</span><span class="pun">(</span><span class="str">"Hello"</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">);</span><span class="pln">
foreach </span><span class="pun">(</span><span class="pln">var item in repeats</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">/* output:
    Hello
    Hello
    Hello
    Hello
*/</span></pre>

<h2>
	التابع Empty
</h2>

<p>
	يُنشِئ التابع <code>Empty</code> مُعدَّدًا فارغًا من الواجهة <code>IEnumerable&lt;T&gt;‎</code>. يَستقبِل التابع نوع المُعدَّد كمُعامِل نوع (type parameter). فمثلًا، يُنشِئ المثال التالي مُُعدَّد من النوع <code>int</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_67" style="">
<span class="typ">IEnumerable</span><span class="str">&lt;int&gt;</span><span class="pln"> emptyList </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Enumerable</span><span class="pun">.</span><span class="typ">Empty</span><span class="str">&lt;int&gt;</span><span class="pun">();</span></pre>

<p>
	يُخزن التابع <code>Empty</code> كل نوع تم انشائه من المتُعدَّدات الفارغة <code>IEnumerable&lt;T&gt;‎</code> تخزينًا مؤقتًا (caching) ويُعيِد استخدامه عند الحاجة لتنشئة نسخة جديدة من نفس النوع، وبالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_69" style="">
<span class="typ">Enumerable</span><span class="pun">.</span><span class="typ">Empty</span><span class="str">&lt;decimal&gt;</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Enumerable</span><span class="pun">.</span><span class="typ">Empty</span><span class="str">&lt;decimal&gt;</span><span class="pun">();</span><span class="pln"> </span><span class="com">// This is True</span><span class="pln">
</span><span class="typ">Enumerable</span><span class="pun">.</span><span class="typ">Empty</span><span class="str">&lt;int&gt;</span><span class="pun">()</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="typ">Enumerable</span><span class="pun">.</span><span class="typ">Empty</span><span class="str">&lt;decimal&gt;</span><span class="pun">();</span><span class="pln">
</span><span class="com">// This is False</span></pre>

<h2>
	التابع Select (ربط map)
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_71" style="">
<span class="pln">var persons
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Foo"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Bar"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Fizz"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Buzz"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var names </span><span class="pun">=</span><span class="pln"> persons</span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> names</span><span class="pun">.</span><span class="typ">ToArray</span><span class="pun">()));</span><span class="pln">


</span><span class="com">//Foo,Bar,Fizz,Buzz</span></pre>

<p>
	تُطلِق لغات البرمجة الوَظِيفية (functional languages) اسم الرَبْط (map) على هذا النوع من الدوال.
</p>

<h2>
	التابع OrderBy
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_73" style="">
<span class="pln">var persons
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Foo"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Bar"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Fizz"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Buzz"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var personsSortedByName </span><span class="pun">=</span><span class="pln"> persons</span><span class="pun">.</span><span class="typ">OrderBy</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> personsSortedByName</span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">).</span><span class="typ">ToArray</span><span class="pun">()));</span><span class="pln">


</span><span class="com">//2,4,3,1</span></pre>

<h2>
	التابع OrderByDescending
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_75" style="">
<span class="pln">var persons
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Foo"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Bar"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Fizz"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Buzz"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var personsSortedByNameDescending </span><span class="pun">=</span><span class="pln"> persons</span><span class="pun">.</span><span class="typ">OrderByDescending</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> personsSortedByNameDescending</span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">).</span><span class="typ">ToArray</span><span class="pun">()));</span><span class="pln">


</span><span class="com">//1,3,4,2</span></pre>

<h2>
	التابع Contains
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_77" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">numbers</span><span class="pun">.</span><span class="typ">Contains</span><span class="pun">(</span><span class="lit">3</span><span class="pun">));</span><span class="pln"> </span><span class="com">//True</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">numbers</span><span class="pun">.</span><span class="typ">Contains</span><span class="pun">(</span><span class="lit">34</span><span class="pun">));</span><span class="pln"> </span><span class="com">//False</span></pre>

<h2>
	التابع First (بحث وجلب find)
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_79" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">


var firstNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">First</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">firstNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//1</span><span class="pln">


var firstEvenNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">First</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">firstEvenNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//2</span></pre>

<p>
	عند عدم تواجد أي عناصر تُحقِق شرط الدالة المجردة المُمرَّرة للتابع، يُبلَّغ عن اعتراض من النوع <code>InvalidOperationException</code> مَصحُوبًا بالرسالة التالية "لا تحتوي المتتالية على أية عناصر مُتوافِقة".
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_81" style="">
<span class="pln">var firstNegativeNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">First</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span></pre>

<h2>
	التابع Single
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_83" style="">
<span class="pln">var oneNumber </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
var theOnlyNumber </span><span class="pun">=</span><span class="pln"> oneNumber</span><span class="pun">.</span><span class="typ">Single</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">theOnlyNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//5</span><span class="pln">


var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">


var theOnlyNumberSmallerThanTwo </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Single</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">theOnlyNumberSmallerThanTwo</span><span class="pun">);</span><span class="pln"> </span><span class="com">//1</span></pre>

<p>
	عند تواجد أكثر من عنصر يُحقِق شرط الدالة المجردة أو عند عدم وجوده نهائيًا كاﻷمثلة التالية، يُبلِّغ التابع <code>Single</code> عن اعتراض من النوع <code>InvalidOperationException</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_85" style="">
<span class="pln">var theOnlyNumberInNumbers </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Single</span><span class="pun">();</span><span class="pln">
var theOnlyNegativeNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Single</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span></pre>

<h2>
	التابع Last
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_87" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
var lastNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Last</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">lastNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//5</span><span class="pln">


var lastEvenNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Last</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">lastEvenNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//4</span></pre>

<p>
	في المثال التالي، يُبلَّغ عن اعتراض من النوع <code>InvalidOperationException</code> لعدَم وجود أيّ عنصر يُحقِق شرط الدالة المُجردَّة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_89" style="">
<span class="pln">var lastNegativeNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Last</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span></pre>

<h2>
	التابع LastOrDefault
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_91" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">


var lastNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">LastOrDefault</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">lastNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//5</span><span class="pln">


var lastEvenNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">LastOrDefault</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">lastEvenNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//4</span><span class="pln">


var lastNegativeNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">LastOrDefault</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">lastNegativeNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//0</span><span class="pln">


var words </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"one"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"two"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"three"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"four"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"five"</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
var lastWord </span><span class="pun">=</span><span class="pln"> words</span><span class="pun">.</span><span class="typ">LastOrDefault</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">lastWord</span><span class="pun">);</span><span class="pln"> </span><span class="com">// five</span><span class="pln">


var lastLongWord </span><span class="pun">=</span><span class="pln"> words</span><span class="pun">.</span><span class="typ">LastOrDefault</span><span class="pun">(</span><span class="pln">w </span><span class="pun">=&gt;</span><span class="pln"> w</span><span class="pun">.</span><span class="typ">Length</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">4</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">lastLongWord</span><span class="pun">);</span><span class="pln"> </span><span class="com">// three</span><span class="pln">


var lastMissingWord </span><span class="pun">=</span><span class="pln"> words</span><span class="pun">.</span><span class="typ">LastOrDefault</span><span class="pun">(</span><span class="pln">w </span><span class="pun">=&gt;</span><span class="pln"> w</span><span class="pun">.</span><span class="typ">Length</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">lastMissingWord</span><span class="pun">);</span><span class="pln"> </span><span class="com">// null</span></pre>

<h2>
	التابع SingleOrDefault
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_93" style="">
<span class="pln">var oneNumber </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
var theOnlyNumber </span><span class="pun">=</span><span class="pln"> oneNumber</span><span class="pun">.</span><span class="typ">SingleOrDefault</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">theOnlyNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//5</span><span class="pln">


var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">


var theOnlyNumberSmallerThanTwo </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">SingleOrDefault</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">theOnlyNumberSmallerThanTwo</span><span class="pun">);</span><span class="pln"> </span><span class="com">//1</span><span class="pln">


var theOnlyNegativeNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">SingleOrDefault</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">theOnlyNegativeNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//0</span></pre>

<p>
	يَختلف عن التابع <code>Single</code> عند عدم تواجد أي عنصر يُحقِق شرط الدالة المجردة، ففي هذه الحالة، لا يُبلِّغ التابع <code>SingleOrDefault</code> عن اعتراض، وإنما يُعيد القيمة الافتراضية للنوع الذي يحتويه المُُعدَّد. أما في حالة تواجد أكثر من عنصر، فإنه -مثل التابع <code>Single</code>- يُبلِّغ عن اعتراض من النوع <code>InvalidOperationException</code> كالمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_95" style="">
<span class="pln">var theOnlyNumberInNumbers </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">SingleOrDefault</span><span class="pun">();</span></pre>

<h2>
	التابع FirstOrDefault
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_97" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">


var firstNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">FirstOrDefault</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">firstNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//1</span><span class="pln">


var firstEvenNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">FirstOrDefault</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">firstEvenNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//2</span><span class="pln">


var firstNegativeNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">FirstOrDefault</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">firstNegativeNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//0</span><span class="pln">


var words </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"one"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"two"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"three"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"four"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"five"</span><span class="pln"> </span><span class="pun">};</span><span class="pln">


var firstWord </span><span class="pun">=</span><span class="pln"> words</span><span class="pun">.</span><span class="typ">FirstOrDefault</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">firstWord</span><span class="pun">);</span><span class="pln"> </span><span class="com">// one</span><span class="pln">


var firstLongWord </span><span class="pun">=</span><span class="pln"> words</span><span class="pun">.</span><span class="typ">FirstOrDefault</span><span class="pun">(</span><span class="pln">w </span><span class="pun">=&gt;</span><span class="pln"> w</span><span class="pun">.</span><span class="typ">Length</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">firstLongWord</span><span class="pun">);</span><span class="pln"> </span><span class="com">// three</span><span class="pln">


var firstMissingWord </span><span class="pun">=</span><span class="pln"> words</span><span class="pun">.</span><span class="typ">FirstOrDefault</span><span class="pun">(</span><span class="pln">w </span><span class="pun">=&gt;</span><span class="pln"> w</span><span class="pun">.</span><span class="typ">Length</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">5</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">firstMissingWord</span><span class="pun">);</span><span class="pln"> </span><span class="com">// null</span></pre>

<h2>
	التابع Skip
</h2>

<p>
	يقوم التابع <code>Skip</code> بتَخطِي أول مجموعة من العناصر بالمُعدَّد. عدد تلك العناصر يُحدِّده مُعامل دَخْل يُمرَّر للتابع. عندما يَصِل التابع <code>Skip</code> إلى أول عنصر بعد تلك المجموعة، يبدأ بإعادة قيم العناصر عند تَعدِّيدها.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_99" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">


var allNumbersExceptFirstTwo </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Skip</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> allNumbersExceptFirstTwo</span><span class="pun">.</span><span class="typ">ToArray</span><span class="pun">()));</span><span class="pln">


</span><span class="com">//3,4,5</span></pre>

<h2>
	التابع Take
</h2>

<p>
	يَجِلْب التابع <code>Take</code> أول مجموعة عناصر من المُعدَّد، ويحدِّد عددها مُعامل دَخْل يُمرَّر للتابع.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_101" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
var threeFirstNumbers </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Take</span><span class="pun">(</span><span class="lit">3</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> threeFirstNumbers</span><span class="pun">.</span><span class="typ">ToArray</span><span class="pun">()));</span><span class="pln">


</span><span class="com">//1,2,3</span></pre>

<h2>
	التابع Reverse
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_103" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
var reversed </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Reverse</span><span class="pun">();</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> reversed</span><span class="pun">.</span><span class="typ">ToArray</span><span class="pun">()));</span><span class="pln">


</span><span class="com">//5,4,3,2,1</span></pre>

<h2>
	التابع OfType
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_105" style="">
<span class="pln">var mixed </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> object</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="str">"Foo"</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="str">"Bar"</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="str">"Fizz"</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="str">"Buzz"</span><span class="pun">};</span><span class="pln">
var numbers </span><span class="pun">=</span><span class="pln"> mixed</span><span class="pun">.</span><span class="typ">OfType</span><span class="str">&lt;int&gt;</span><span class="pun">();</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">ToArray</span><span class="pun">()));</span><span class="pln">


</span><span class="com">//1,2,3,4</span></pre>

<h2>
	التابع Max
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_107" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">};</span><span class="pln">


var maxNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Max</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">maxNumber</span><span class="pun">);</span><span class="pln"> </span><span class="com">//4</span><span class="pln">


var cities </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Population</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Population</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2500</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Population</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4000</span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var maxPopulation </span><span class="pun">=</span><span class="pln"> cities</span><span class="pun">.</span><span class="typ">Max</span><span class="pun">(</span><span class="pln">c </span><span class="pun">=&gt;</span><span class="pln"> c</span><span class="pun">.</span><span class="typ">Population</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">maxPopulation</span><span class="pun">);</span><span class="pln"> </span><span class="com">//4000</span></pre>

<h2>
	التابع Average
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_109" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">};</span><span class="pln">


var averageNumber </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Average</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">averageNumber</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 2,5</span></pre>

<p>
	يَحسِب التابع <code>Average</code> في المثال باﻷعلى قيمة مُتوسِط مُعدَّد من النوع العَدَدي.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_111" style="">
<span class="pln">var cities </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Population</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Population</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2000</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Population</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">4000</span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var averagePopulation </span><span class="pun">=</span><span class="pln"> cities</span><span class="pun">.</span><span class="typ">Average</span><span class="pun">(</span><span class="pln">c </span><span class="pun">=&gt;</span><span class="pln"> c</span><span class="pun">.</span><span class="typ">Population</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">averagePopulation</span><span class="pun">);</span><span class="pln">
</span><span class="com">// 2333,33</span></pre>

<p>
	يَحِسب التابع في المثال بالأعلى قيمة مُتوسِط المُعدَّد بالاعتماد على مُفوِّض (delegated function) يُمرَّر له.
</p>

<h2>
	التابع GroupBy
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_113" style="">
<span class="pln">var persons </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Fizz"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Job</span><span class="pun">=</span><span class="str">"Developer"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Buzz"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Job</span><span class="pun">=</span><span class="str">"Developer"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Foo"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Job</span><span class="pun">=</span><span class="str">"Astronaut"</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Bar"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Job</span><span class="pun">=</span><span class="str">"Astronaut"</span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span><span class="pln">
var groupedByJob </span><span class="pun">=</span><span class="pln"> persons</span><span class="pun">.</span><span class="typ">GroupBy</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Job</span><span class="pun">);</span><span class="pln">
foreach</span><span class="pun">(</span><span class="pln">var theGroup in groupedByJob</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">
        </span><span class="str">"{0} are {1}s"</span><span class="pun">,</span><span class="pln">
        string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> theGroup</span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">g </span><span class="pun">=&gt;</span><span class="pln"> g</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">).</span><span class="typ">ToArray</span><span class="pun">()),</span><span class="pln">
        theGroup</span><span class="pun">.</span><span class="typ">Key</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="com">//Fizz,Buzz are Developers</span><span class="pln">
</span><span class="com">//Foo,Bar are Astronauts</span></pre>

<p>
	في المثال التالي، تُجَمَّع الفواتير وفقًا لقيمة الدولة، ويُنشَّئ لكلًا منها كائن جديد يحتوي على عدد السِجلات، والقيمة المدفوعة الكلية، ومتوسط القيمة المدفوعة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_115" style="">
<span class="pln">var a </span><span class="pun">=</span><span class="pln"> db</span><span class="pun">.</span><span class="typ">Invoices</span><span class="pun">.</span><span class="typ">GroupBy</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=&gt;</span><span class="pln"> i</span><span class="pun">.</span><span class="typ">Country</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">g </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Country</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> g</span><span class="pun">.</span><span class="typ">Key</span><span class="pun">,</span><span class="pln">
                      </span><span class="typ">Count</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> g</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">(),</span><span class="pln">
                      </span><span class="typ">Total</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> g</span><span class="pun">.</span><span class="typ">Sum</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=&gt;</span><span class="pln"> i</span><span class="pun">.</span><span class="typ">Paid</span><span class="pun">),</span><span class="pln">
                      </span><span class="typ">Average</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> g</span><span class="pun">.</span><span class="typ">Average</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=&gt;</span><span class="pln"> i</span><span class="pun">.</span><span class="typ">Paid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">});</span></pre>

<p>
	إذا أردنا المدفوعات فقط بدون مجموعات:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_117" style="">
<span class="pln">var a </span><span class="pun">=</span><span class="pln"> db</span><span class="pun">.</span><span class="typ">Invoices</span><span class="pun">.</span><span class="typ">GroupBy</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">g </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Count</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> g</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">(),</span><span class="pln">
                      </span><span class="typ">Total</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> g</span><span class="pun">.</span><span class="typ">Sum</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=&gt;</span><span class="pln"> i</span><span class="pun">.</span><span class="typ">Paid</span><span class="pun">),</span><span class="pln">
                      </span><span class="typ">Average</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> g</span><span class="pun">.</span><span class="typ">Average</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=&gt;</span><span class="pln"> i</span><span class="pun">.</span><span class="typ">Paid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">});</span></pre>

<p>
	إذا أردنا أكثر من تِعداد:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_119" style="">
<span class="pln">var a </span><span class="pun">=</span><span class="pln"> db</span><span class="pun">.</span><span class="typ">Invoices</span><span class="pun">.</span><span class="typ">GroupBy</span><span class="pun">(</span><span class="pln">g </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">g </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">High</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> g</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=&gt;</span><span class="pln"> i</span><span class="pun">.</span><span class="typ">Paid</span><span class="pln"> </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">),</span><span class="pln">
                      </span><span class="typ">Low</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> g</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=&gt;</span><span class="pln"> i</span><span class="pun">.</span><span class="typ">Paid</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">),</span><span class="pln">
                      </span><span class="typ">Sum</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> g</span><span class="pun">.</span><span class="typ">Sum</span><span class="pun">(</span><span class="pln">i </span><span class="pun">=&gt;</span><span class="pln"> i</span><span class="pun">.</span><span class="typ">Paid</span><span class="pun">)</span><span class="pln"> </span><span class="pun">});</span></pre>

<h2>
	التابع ToDictionary
</h2>

<p>
	يُحول التابع <code>ToDictionary</code> مُعامِل مُعدَّد من الوَاجِهة <code>IEnumerable</code> -يُدعى المصدر <code>source</code>- إلى قاموس (Dictionary)، بالاستعانة بمُعامِل دالة مُجردة تُمرَّر للتابع -تُدعى <code>keySelector</code>- لتحديد مفاتيح القاموس (keys).
</p>

<p>
	يُبلِّغ التابع عن اعتراض من النوع <code>ArgumentException</code> إذا كانت الدالة المُجردَّة <code>keySelector</code> غير مُتباينة (الدالة المُتباينة injective هي دالة تعيد قيمة فريدة (unique) لكل عنصر بمُعامل التَجمِيعَة <code>source</code>).
</p>

<p>
	تتوفر توابع التحميل الزائد (overloads) من التابع <code>ToDictionary</code>، والتي تَستقبِل دوال مجردة لتخصيص مفاتيح (keys) وقيم (value) القاموس.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_121" style="">
<span class="pln">var persons </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Fizz"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Id</span><span class="pun">=</span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Buzz"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Id</span><span class="pun">=</span><span class="lit">2</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Foo"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Id</span><span class="pun">=</span><span class="lit">3</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Bar"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Id</span><span class="pun">=</span><span class="lit">4</span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	إذا ما خُصِّصَت دالة اختيار المفتاح فقط، سيُنشَّئ قاموس من النوع <code>Dictionary&lt;TKey,TVal&gt;‎</code>. بحيث يكون نوع المفتاح <code>TKey</code> من نفس نوع القيمة العائدة من الدالة <code>KeySelector</code>، بينما يكون نوع القيمة <code>TVal</code> من نفس نوع الكائن اﻷصلي ويحمل قيمته.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_123" style="">
<span class="pln">var personsById </span><span class="pun">=</span><span class="pln"> persons</span><span class="pun">.</span><span class="typ">ToDictionary</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">);</span><span class="pln">
</span><span class="com">// personsById is a Dictionary&lt;int,object&gt;</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">personsById</span><span class="pun">[</span><span class="lit">1</span><span class="pun">].</span><span class="typ">Name</span><span class="pun">);</span><span class="pln"> </span><span class="com">//Fizz</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">personsById</span><span class="pun">[</span><span class="lit">2</span><span class="pun">].</span><span class="typ">Name</span><span class="pun">);</span><span class="pln"> </span><span class="com">//Buzz</span></pre>

<p>
	أما إذا خُصّصت دالة اختيار القيمة <code>ValueSelector</code> أيضًا، فسيُنشَّئ قاموس من النوع <code>Dictionary&lt;TKey,TVal&gt;‎</code>. بحيث يكون نوع المفتاح <code>TKey</code> من نفس نوع القيمة العائدة من الدالة <code>KeySelector</code>، ويكون نوع القيمة <code>TVal</code> من نفس نوع القيمة العائدة من الدالة <code>ValueSelector</code> ويحمل قيمتها الفِعلية تِباعًا.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_125" style="">
<span class="pln">var namesById </span><span class="pun">=</span><span class="pln"> persons</span><span class="pun">.</span><span class="typ">ToDictionary</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">,</span><span class="pln"> p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">);</span><span class="pln">
</span><span class="com">//namesById is a Dictionary&lt;int,string&gt;</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">namesById</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]);</span><span class="pln"> </span><span class="com">//Foo</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">namesById</span><span class="pun">[</span><span class="lit">4</span><span class="pun">]);</span><span class="pln"> </span><span class="com">//Bar</span></pre>

<p>
	كما ذُكر باﻷعلى، يجب أن تكون المفاتيح -التي تعيدها دالة اختيار المفاتيح- فريدة. في المثال التالي، يُبلَّغ عن اعتراض لمُخالفة هذا الشرط:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_127" style="">
<span class="pln">var persons </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Fizz"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Id</span><span class="pun">=</span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Buzz"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Id</span><span class="pun">=</span><span class="lit">2</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Foo"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Id</span><span class="pun">=</span><span class="lit">3</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Bar"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Id</span><span class="pun">=</span><span class="lit">4</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pun">=</span><span class="str">"Oops"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Id</span><span class="pun">=</span><span class="lit">4</span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var willThrowException </span><span class="pun">=</span><span class="pln"> persons</span><span class="pun">.</span><span class="typ">ToDictionary</span><span class="pun">(</span><span class="pln">p </span><span class="pun">=&gt;</span><span class="pln"> p</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">)</span></pre>

<p>
	إذا لم يكن بالإمكان تخصيص مفتاح فريد لكل عنصر بالتَجمِيعَة، يُمكِنك استخدام التابع <code>ToLookUp</code>. ظاهريًا، يعمل التابع <code>ToLookup</code> بصورة مشابهة للتابع <code>ToDictionary</code>، بِخلاف إمكانية ربطه لكل مفتاح بتَجمِيعَة من القيم التي تَحمِل نفس المفتاح.
</p>

<h2>
	التابع Union
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_129" style="">
<span class="pln">var numbers1to5 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">};</span><span class="pln">
var numbers4to8 </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">7</span><span class="pun">,</span><span class="lit">8</span><span class="pun">};</span><span class="pln">


var numbers1to8 </span><span class="pun">=</span><span class="pln"> numbers1to5</span><span class="pun">.</span><span class="typ">Union</span><span class="pun">(</span><span class="pln">numbers4to8</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> numbers1to8</span><span class="pun">));</span><span class="pln">


</span><span class="com">//1,2,3,4,5,6,7,8</span></pre>

<p>
	يَحذِف التابع <code>Union</code> العناصر المُكرّرة. اِستخدِم التابع <code>Concat</code> إذا لم يكن ذلك ما ترغب به.
</p>

<h2>
	التابع ToArray
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_131" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">7</span><span class="pun">,</span><span class="lit">8</span><span class="pun">,</span><span class="lit">9</span><span class="pun">,</span><span class="lit">10</span><span class="pun">};</span><span class="pln">
var someNumbers </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Where</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">6</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">someNumbers</span><span class="pun">.</span><span class="typ">GetType</span><span class="pun">().</span><span class="typ">Name</span><span class="pun">);</span><span class="pln">
</span><span class="com">//WhereArrayIterator`1</span><span class="pln">


var someNumbersArray </span><span class="pun">=</span><span class="pln"> someNumbers</span><span class="pun">.</span><span class="typ">ToArray</span><span class="pun">();</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">someNumbersArray</span><span class="pun">.</span><span class="typ">GetType</span><span class="pun">().</span><span class="typ">Name</span><span class="pun">);</span><span class="pln">
</span><span class="com">//Int32[]</span></pre>

<h2>
	التابع ToList
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_133" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="lit">2</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">5</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">7</span><span class="pun">,</span><span class="lit">8</span><span class="pun">,</span><span class="lit">9</span><span class="pun">,</span><span class="lit">10</span><span class="pun">};</span><span class="pln">
var someNumbers </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">Where</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> n </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">6</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">someNumbers</span><span class="pun">.</span><span class="typ">GetType</span><span class="pun">().</span><span class="typ">Name</span><span class="pun">);</span><span class="pln">
</span><span class="com">//WhereArrayIterator`1</span><span class="pln">


var someNumbersList </span><span class="pun">=</span><span class="pln"> someNumbers</span><span class="pun">.</span><span class="typ">ToList</span><span class="pun">();</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">
    someNumbersList</span><span class="pun">.</span><span class="typ">GetType</span><span class="pun">().</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">" - "</span><span class="pln"> </span><span class="pun">+</span><span class="pln">
    someNumbersList</span><span class="pun">.</span><span class="typ">GetType</span><span class="pun">().</span><span class="typ">GetGenericArguments</span><span class="pun">()[</span><span class="lit">0</span><span class="pun">].</span><span class="typ">Name</span><span class="pun">);</span><span class="pln">
</span><span class="com">//List`1 - Int32</span></pre>

<h2>
	التابع List<t>.ForEach</t>
</h2>

<p>
	التابع <code>ForEach</code> مُعرف بالصنف <code>List&lt;T&gt;‎</code>، وليس بأيّ من الوَاجِهتين <code>IQueryable&lt;T&gt;‎</code> أو <code>IEnumerable&lt;T&gt;‎</code>. ومِنْ ثَمَّ إذا أردت استدعاء هذا التابع من خلال كائن من احدى هاتين الوَاجِهتين، فلديك خيارين:
</p>

<ul>
<li>
		الخيار اﻷول: استدعاء التابع <code>ToList</code> أولًا
	</li>
</ul>
<p>
	عند استدعاء التابع <code>ToList</code>، سيحدث شيئًا من اثنين اعتمادًا على وَاجِهة الكائن. إذا كان الكائن من الوَاجِهة <code>IEnumerable&lt;T&gt;‎</code>، ستُجرَى عملية تِعِداد (enumeration) للمُعدَّد، مما يؤدي إلى نَسخ النتيجة إلى قائمة جديدة (List). أما إذا كان الكائن من الوَاجِهة <code>IQueryable&lt;T&gt;‎</code>، فستُجرَى عملية اتصال بقاعدة البيانات لتنفيذ عبارة استعلام (query) مُعيّنة. وأخيرًا، سيُستدعَى التابع <code>ForEach</code> لكل عنصر بالقائمة. مثلًا:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_135" style="">
<span class="typ">IEnumerable</span><span class="pun">&lt;</span><span class="typ">Customer</span><span class="pun">&gt;</span><span class="pln"> customers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">Customer</span><span class="pun">&gt;();</span><span class="pln">


customers</span><span class="pun">.</span><span class="typ">ToList</span><span class="pun">().</span><span class="typ">ForEach</span><span class="pun">(</span><span class="pln">c </span><span class="pun">=&gt;</span><span class="pln"> c</span><span class="pun">.</span><span class="typ">SendEmail</span><span class="pun">());</span></pre>

<p>
	تُعاني هذه الطريقة مِن استهلاك غير ضروري للذاكرة بسبب الاضطرار لإنشاء مؤقت لقائمة (List).
</p>

<ul>
<li>
		الخيار الثاني: استخدام التابع المُوسِّع (Extension Method)
	</li>
</ul>
<p>
	أضِف التابع المُوسِّع التالي للواجهة <code>IEnumerable&lt;T&gt;‎</code> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_137" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">ForEach</span><span class="pun">&lt;</span><span class="pln">T</span><span class="pun">&gt;(</span><span class="kwd">this</span><span class="pln"> </span><span class="typ">IEnumerable</span><span class="pun">&lt;</span><span class="pln">T</span><span class="pun">&gt;</span><span class="pln"> enumeration</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Action</span><span class="pun">&lt;</span><span class="pln">T</span><span class="pun">&gt;</span><span class="pln"> action</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    foreach</span><span class="pun">(</span><span class="pln">T item in enumeration</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        action</span><span class="pun">(</span><span class="pln">item</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ثم اِستَدعه مباشرة من خلال الوَاجِهة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_139" style="">
<span class="typ">IEnumerable</span><span class="pun">&lt;</span><span class="typ">Customer</span><span class="pun">&gt;</span><span class="pln"> customers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">Customer</span><span class="pun">&gt;();</span><span class="pln">


customers</span><span class="pun">.</span><span class="typ">ForEach</span><span class="pun">(</span><span class="pln">c </span><span class="pun">=&gt;</span><span class="pln"> c</span><span class="pun">.</span><span class="typ">SendEmail</span><span class="pun">());</span></pre>

<p>
	تنبيه: صُممت توابع الاستعلامات التكميلية اللغوية LINQ لتكون نَقيَّة (pure methods)، مما يَعنيّ عدم تَسَبّبهم بأيّ تأثيرات جانبية (side effects). يَنحرِف التابع <code>ForEach</code> عن بقية التوابع من هذه الناحية لأن هدفه اﻷوحد هو إحِداث تأثير جانبي. بدلًا من ذلك، قد تُنفِذ التِكرار (loop) باستخدام الكلمة المفتاحية <code>foreach</code>، وهذا، في الواقع، ما تَفعله الدالة المُوسِّعة باﻷعلى داخليًا.
</p>

<p>
	في حالة كنت تُريد إجراء التكرار على مُتغير من النوع List، يُمكنك استدعاء التابع <code>ForEach</code> مُباشِرة دون الحاجة إلى أي توابع مُوسِّعة، كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_141" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Customer</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">SendEmail</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// Sending email code here</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


</span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">Customer</span><span class="pun">&gt;</span><span class="pln"> customers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">Customer</span><span class="pun">&gt;();</span><span class="pln">


customers</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Customer</span><span class="pun">());</span><span class="pln">
customers</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Customer</span><span class="pun">());</span><span class="pln">


customers</span><span class="pun">.</span><span class="typ">ForEach</span><span class="pun">(</span><span class="pln">c </span><span class="pun">=&gt;</span><span class="pln"> c</span><span class="pun">.</span><span class="typ">SendEmail</span><span class="pun">());</span></pre>

<h2>
	التابع ElementAt
</h2>

<p>
	يُبلِّغ التابع <code>ElementAt</code> عن اعتراض من النوع <code>ArgumentOutOfRangeException</code> عند تمرِّير فِهرَس (index) خارج مدى (Range) المُتعدَّد.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_143" style="">
<span class="pln">var names </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="str">"Foo"</span><span class="pun">,</span><span class="str">"Bar"</span><span class="pun">,</span><span class="str">"Fizz"</span><span class="pun">,</span><span class="str">"Buzz"</span><span class="pun">};</span><span class="pln">


var thirdName </span><span class="pun">=</span><span class="pln"> names</span><span class="pun">.</span><span class="typ">ElementAt</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">thirdName</span><span class="pun">);</span><span class="pln"> </span><span class="com">//Fizz</span></pre>

<p>
	سيُبلَّغ عن اعتراض <code>ArgumentOutOfRangeException</code> في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_145" style="">
<span class="pln">var names </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="str">"Foo"</span><span class="pun">,</span><span class="str">"Bar"</span><span class="pun">,</span><span class="str">"Fizz"</span><span class="pun">,</span><span class="str">"Buzz"</span><span class="pun">};</span><span class="pln">


var minusOnethName </span><span class="pun">=</span><span class="pln"> names</span><span class="pun">.</span><span class="typ">ElementAt</span><span class="pun">(-</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
var fifthName </span><span class="pun">=</span><span class="pln"> names</span><span class="pun">.</span><span class="typ">ElementAt</span><span class="pun">(</span><span class="lit">4</span><span class="pun">);</span></pre>

<h2>
	التابع ElementAtOrDefault
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_147" style="">
<span class="pln">var names </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="str">"Foo"</span><span class="pun">,</span><span class="str">"Bar"</span><span class="pun">,</span><span class="str">"Fizz"</span><span class="pun">,</span><span class="str">"Buzz"</span><span class="pun">};</span><span class="pln">


var thirdName </span><span class="pun">=</span><span class="pln"> names</span><span class="pun">.</span><span class="typ">ElementAtOrDefault</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">thirdName</span><span class="pun">);</span><span class="pln"> </span><span class="com">//Fizz</span><span class="pln">


var minusOnethName </span><span class="pun">=</span><span class="pln"> names</span><span class="pun">.</span><span class="typ">ElementAtOrDefault</span><span class="pun">(-</span><span class="lit">1</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">minusOnethName</span><span class="pun">);</span><span class="pln"> </span><span class="com">//null</span><span class="pln">


var fifthName </span><span class="pun">=</span><span class="pln"> names</span><span class="pun">.</span><span class="typ">ElementAtOrDefault</span><span class="pun">(</span><span class="lit">4</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">fifthName</span><span class="pun">);</span><span class="pln"> </span><span class="com">//null</span></pre>

<h2>
	التابع SkipWhile
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_149" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">2</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">8</span><span class="pun">,</span><span class="lit">1</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">5</span><span class="pun">,</span><span class="lit">7</span><span class="pun">};</span><span class="pln">


var oddNumbers </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">SkipWhile</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> oddNumbers</span><span class="pun">.</span><span class="typ">ToArray</span><span class="pun">()));</span><span class="pln">


</span><span class="com">//1,3,5,7</span></pre>

<h2>
	التابع TakeWhile
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_151" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">2</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">1</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">5</span><span class="pun">,</span><span class="lit">7</span><span class="pun">,</span><span class="lit">8</span><span class="pun">};</span><span class="pln">


var evenNumbers </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">TakeWhile</span><span class="pun">(</span><span class="pln">n </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">n </span><span class="pun">&amp;</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">


</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="str">","</span><span class="pun">,</span><span class="pln"> evenNumbers</span><span class="pun">.</span><span class="typ">ToArray</span><span class="pun">()));</span><span class="pln">


</span><span class="com">//2,4,6</span></pre>

<h2>
	التابع DefaultIfEmpty
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_153" style="">
<span class="pln">var numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="lit">2</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">6</span><span class="pun">,</span><span class="lit">8</span><span class="pun">,</span><span class="lit">1</span><span class="pun">,</span><span class="lit">3</span><span class="pun">,</span><span class="lit">5</span><span class="pun">,</span><span class="lit">7</span><span class="pun">};</span><span class="pln">


var numbersOrDefault </span><span class="pun">=</span><span class="pln"> numbers</span><span class="pun">.</span><span class="typ">DefaultIfEmpty</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">numbers</span><span class="pun">.</span><span class="typ">SequenceEqual</span><span class="pun">(</span><span class="pln">numbersOrDefault</span><span class="pun">));</span><span class="pln"> </span><span class="com">//True</span><span class="pln">


var noNumbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">int</span><span class="pun">[</span><span class="lit">0</span><span class="pun">];</span><span class="pln">


var noNumbersOrDefault </span><span class="pun">=</span><span class="pln"> noNumbers</span><span class="pun">.</span><span class="typ">DefaultIfEmpty</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">noNumbersOrDefault</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">());</span><span class="pln"> </span><span class="com">//1</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">noNumbersOrDefault</span><span class="pun">.</span><span class="typ">Single</span><span class="pun">());</span><span class="pln"> </span><span class="com">//0</span><span class="pln">


var noNumbersOrExplicitDefault </span><span class="pun">=</span><span class="pln"> noNumbers</span><span class="pun">.</span><span class="typ">DefaultIfEmpty</span><span class="pun">(</span><span class="lit">34</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">noNumbersOrExplicitDefault</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">());</span><span class="pln"> </span><span class="com">//1</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">noNumbersOrExplicitDefault</span><span class="pun">.</span><span class="typ">Single</span><span class="pun">());</span><span class="pln"> </span><span class="com">//34</span></pre>

<h2>
	التابع Join
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_155" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Developer</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Project</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">DeveloperId</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


var developers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Developer</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Foobuzz"</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Developer</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Barfizz"</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var projects </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Project</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">DeveloperId</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello World 3D"</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Project</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">DeveloperId</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Super Fizzbuzz Maker"</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Project</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">DeveloperId</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Citizen Kane - The action game"</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Project</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">DeveloperId</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Pro Pong 2016"</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


var denormalized </span><span class="pun">=</span><span class="pln"> developers</span><span class="pun">.</span><span class="typ">Join</span><span class="pun">(</span><span class="pln">
    inner</span><span class="pun">:</span><span class="pln"> projects</span><span class="pun">,</span><span class="pln">
    outerKeySelector</span><span class="pun">:</span><span class="pln"> dev </span><span class="pun">=&gt;</span><span class="pln"> dev</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">,</span><span class="pln">
    innerKeySelector</span><span class="pun">:</span><span class="pln"> proj </span><span class="pun">=&gt;</span><span class="pln"> proj</span><span class="pun">.</span><span class="typ">DeveloperId</span><span class="pun">,</span><span class="pln">
    resultSelector</span><span class="pun">:</span><span class="pln">
    </span><span class="pun">(</span><span class="pln">dev</span><span class="pun">,</span><span class="pln"> proj</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">ProjectName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> proj</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">DeveloperName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> dev</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">});</span><span class="pln">


foreach</span><span class="pun">(</span><span class="pln">var item in denormalized</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"{0} by {1}"</span><span class="pun">,</span><span class="pln"> item</span><span class="pun">.</span><span class="typ">ProjectName</span><span class="pun">,</span><span class="pln"> item</span><span class="pun">.</span><span class="typ">DeveloperName</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


</span><span class="com">//Hello World 3D by Foobuzz</span><span class="pln">
</span><span class="com">//Super Fizzbuzz Maker by Foobuzz</span><span class="pln">
</span><span class="com">//Citizen Kane - The action game by Barfizz</span><span class="pln">
</span><span class="com">//Pro Pong 2016 by Barfizz</span></pre>

<p>
	مثال آخر عن التابع Join مع تطبيق الضم الخارجي اليساري (left outer join):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7246_157" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Person</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Pet</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Person</span><span class="pln"> </span><span class="typ">Owner</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    var magnus </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Person</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Magnus"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hedlund"</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
    var terry </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Person</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Terry"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Adams"</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
    var barley </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Pet</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Barley"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Owner</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> terry </span><span class="pun">};</span><span class="pln">
    var people </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> magnus</span><span class="pun">,</span><span class="pln"> terry </span><span class="pun">};</span><span class="pln">
    var pets </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> barley </span><span class="pun">};</span><span class="pln">
    var query </span><span class="pun">=</span><span class="pln">
        from person in people
        join pet in pets on person equals pet</span><span class="pun">.</span><span class="typ">Owner</span><span class="pln"> into gj
        from subpet in gj</span><span class="pun">.</span><span class="typ">DefaultIfEmpty</span><span class="pun">()</span><span class="pln">
        select </span><span class="kwd">new</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        person</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">PetName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> subpet</span><span class="pun">?.</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">??</span><span class="pln"> </span><span class="str">"-"</span><span class="pln"> </span><span class="com">// Use - if he has no pet</span><span class="pln">
    </span><span class="pun">};</span><span class="pln">
    foreach </span><span class="pun">(</span><span class="pln">var p in query</span><span class="pun">)</span><span class="pln">
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">$</span><span class="str">"{p.FirstName}: {p.PetName}"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ترجمة -وبتصرف- للفصل LINQ والفصل ForEach من كتاب <a href="https://goalkicker.com/DotNETFrameworkBook/" rel="external nofollow">‎.NET Framework Notes for Professionals</a>
</p>
]]></description><guid isPermaLink="false">948</guid><pubDate>Wed, 29 Jul 2020 13:09:21 +0000</pubDate></item><item><title>&#x627;&#x644;&#x623;&#x646;&#x648;&#x627;&#x639; &#x627;&#x644;&#x645;&#x62E;&#x635;&#x635;&#x629; &#x641;&#x64A; dot NET</title><link>https://academy.hsoub.com/programming/c-sharp/dotnet/%D8%A7%D9%84%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A7%D9%84%D9%85%D8%AE%D8%B5%D8%B5%D8%A9-%D9%81%D9%8A-dot-net-r946/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_07/5.png.975bb0c319e16a0d6f85f0d09d8ba251.png" /></p>

<h2>
	أنواع القيمة (Value types)
</h2>

<p>
	ببساطة، تَحوِّي أنواع القيمة (value types) القِيمَة الفِعلِية.
</p>

<p>
	تُشتَقّ جميع أنواع القيمة -والتي تَتضَمَن غالبية اﻷصناف المبنية مُسبَقًا (built-in types)- مِن الصنف <a href="https://msdn.microsoft.com/en-us/library/system.valuetype.aspx" rel="external nofollow">System.ValueType</a>. ونظرًا لكَوْن هذا الصنف غيْر قابِل للتوريث بشكل مباشر، تُستخَدَم الكلمة المفتاحية صنف (Struct keyword) لإنشاء نوع قيمة مُخصّص (custom value types) كالمثال بالأسفل.
</p>

<p>
	عند إنشّاء نسخة (instance) جديدة من نوع القيمة، تُستَخَدَم ذاكِرة المَكْدَس (Stack Memory) لتخزينها، والتي تَتسِع بما يتوافق مع حجم النوع المُصرّح عنه. على سبيل المثال، يُخصَّص لكل نوع عَدَدِيّ <code>int</code> مِساحة 32 بت بِـذاكِرة المَكْدَس. ويُلْغَى تَخصّيص هذه المساحة عند خروج النُسخة من النِطاق (scope).
</p>

<p>
	مِن المُهم أن تُدرِك أنه عند إِسْناد متغير من نوع القيمة لآخر، تُنسَخ قيمته لا مَرجِعه للمُتغير الآخر، مما يَعّني أنه قد أصبح لدينا نسختين مُنفَصلتين، لا يؤثر تغيير قيمة احِدَاهُما على قيمة النسخة الآخرى.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9778_6" style="">
<span class="kwd">struct</span><span class="pln"> </span><span class="typ">PersonAsValueType</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9778_8" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">PersonAsValueType</span><span class="pln"> personA</span><span class="pun">;</span><span class="pln">

        personA</span><span class="pun">.</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Bob"</span><span class="pun">;</span><span class="pln">

        var personB </span><span class="pun">=</span><span class="pln"> personA</span><span class="pun">;</span><span class="pln">

        personA</span><span class="pun">.</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Linda"</span><span class="pun">;</span><span class="pln">

</span><span class="com">// ‫يُشير المُتغيّران إلى مواضع مختلفة بالذاكرة</span><span class="pln">
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">object</span><span class="pun">.</span><span class="typ">ReferenceEquals</span><span class="pun">(</span><span class="pln">personA</span><span class="pun">,</span><span class="pln"> personB</span><span class="pun">));</span><span class="pln">  </span><span class="com">// 'False' </span><span class="pln">

        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">personA</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Outputs 'Linda'</span><span class="pln">
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">personB</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Outputs 'Bob'</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	أنواع مرجعية (Reference types)
</h2>

<p>
	تتكون الأنواع المَرجعِية (reference types) من قيمة (value) مُخزَّنة بمَكان ما بالذاكرة ومَرجِع (reference) يُشير إلى هذا المكان. يُمكِن القول أنها تَعمَل بصورة مشابهة للمُؤشِرات (pointers) بلغتي C/C++‎.
</p>

<p>
	تُعدّ جميع الأصناف (Classes) -حتى الساكن منها (static class)- من النوع المَرجعِي. يُوضح المثال باﻷسفل استخدام صنف (class) لإنشاء متغير من النوع المَرجِعي وإِسْناده لآخر.
</p>

<p>
	تُخزَّن جميع الأنواع المَرجعِية بقسم الكَوْمَة في الذاكرة (Memory Heap). فعِند إنشاء كائن جديد، تُخصَّص مِساحة من ذاكرة الكَوْمَة له ويُعَاد مَرجِع (reference) يُشير إلى مَوقِع تِلك المساحة. يَتولى كانِس المهملات (garbage collector) مُهِمّة إدارة ذاكرة الكَوْمَة، ولا يُسمَح لك بالتَدخُل أو التحكم بها بنفسك.
</p>

<p>
	بالإضافة إلى مساحة الذاكِرة المُخصَصة للكائن ذاته، تُخصّص مساحة أخرى إضافية لتخزين كلًا من المَرجِع ومعلومات إضافية تحتاجها بيئة التنفيذ المشتركة (CLR) بإطار عمل ‎.NET بصورة مؤقتة.
</p>

<p>
	أحد أهم ما يُفرِّق بين نوعي القيمة والمَرجِع هو أنه عند إِسْناد متغير من نوع مَرجِعي لآخر، يُنسَخ المَرجِع إلى المُتغير الآخر لا القيمة التي يُشير إليها، مما يَعّني أنه قد اَصبح لدينا مَرجِعين يُشيران إلى نفس الكائن. بالتالي، سَيُؤثر أيّ تغيير في القِيم الفِعلية لهذا الكائن على قيمة كلا المَرجِعين.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9778_10" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">PersonAsReferenceType</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9778_12" style="">
<span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">PersonAsReferenceType</span><span class="pln"> personA</span><span class="pun">;</span><span class="pln">

        personA </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">PersonAsReferenceType</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Bob"</span><span class="pln"> </span><span class="pun">};</span><span class="pln">

        var personB </span><span class="pun">=</span><span class="pln"> personA</span><span class="pun">;</span><span class="pln">

        personA</span><span class="pun">.</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Linda"</span><span class="pun">;</span><span class="pln">

         </span><span class="com">// ‫يُشير كلًا من المُتغيّران إلى نفس موضع الذاكرة</span><span class="pln">
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">object</span><span class="pun">.</span><span class="typ">ReferenceEquals</span><span class="pun">(</span><span class="pln">personA</span><span class="pun">,</span><span class="pln"> personB</span><span class="pun">));</span><span class="pln"> </span><span class="com">// 'True' </span><span class="pln">

        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">personA</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 'Linda'</span><span class="pln">
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">personB</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">);</span><span class="pln"> </span><span class="com">// 'Linda'</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	الأنواع المخصصة (Custom Types)
</h2>

<p>
	بالإضافة إلى اﻷصناف المبنية مُسبَقًا (built-in types)، يُمكن إنشاء أصناف مُخصّصة (Custom).
</p>

<h3>
	الصنف <code>Struct</code>
</h3>

<p>
	تَرِث الأصناف (structs) -المُعرَّفة باستخدام الكلمة المفتاحية <code>Struct</code>- النوع <code>System.ValueType</code> تلقائيًا، ولذلك تُعدّ من أنواع القيمة (value types)-كما ذَكرنا مُسبَقًا-، كما تُخزَّن بذاكِرة المَكْدَس (stack).
</p>

<p>
	على سبيل المثال:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9778_14" style="">
<span class="typ">Struct</span><span class="pln"> </span><span class="typ">MyStruct</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> x</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تُمرَّر المُتَغيّرات من نوع القيمة كمُعامِلات للدوال تمريرًا قيميًا (pass by value)، أي تُنسَخ قيمة المُتَغيّر وتُسْنَد لمُعامِل الدالة، وبالتالي إذا غَيرَّت الدالة قيمة المُعامِل فإن هذا التَغيير لا يَنعكِس على قيمة المُتَغيّر الأصلي خارج الدالة؛ لأنه مُجرد نُسخة.
</p>

<p>
	في الشيفرة التالية، تَستقبِل الدالة <code>AddNumbers</code> مُعامِلين <code>x</code> و <code>y</code> من النوع <code>int</code> وهو نوع قيمة. على الرغم من أن الدالة تُزيد قيمة المُعامِل <code>x</code> بمقدار 5، فإن قيمة المُتَغيّر <code>a</code> تظل كما هي؛ لأن المُعامِل <code>x</code> هو، بالواقع، مُجرد نسخة من قيمة المُتَغيّر <code>a</code> وليس المُتَغيّر ذاته.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9778_16" style="">
<span class="typ">int</span><span class="pln"> a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">

</span><span class="typ">AddNumbers</span><span class="pun">(</span><span class="pln">a</span><span class="pun">,</span><span class="pln">b</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">AddNumbers</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> y</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> z </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">     </span><span class="com">// قيمة المتغير‫ z تساوي 11</span><span class="pln">
    x </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">         </span><span class="com">// ‫غُيرت قيمة x إلى القيمة 10</span><span class="pln">
    z </span><span class="pun">=</span><span class="pln"> x </span><span class="pun">+</span><span class="pln"> y</span><span class="pun">;</span><span class="pln">         </span><span class="com">// قيمة المتغير‫ z تساوي 16</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	الصنف <code>class</code>
</h3>

<p>
	تَرِث الأصناف (classes) -المُعرَّفة باستخدام الكلمة المفتاحية <code>Class</code>- النوع <code>System.Object</code> تلقائيًا، ولذلك تُعدّ من الأنواع المَرجِعية (reference types)، كما تُخزَّن بقسم الكَوْمَة في الذاكرة (heap).
</p>

<p>
	على سبيل المثال:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9778_18" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="typ">Class</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> a</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> b</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تُمرَّر المُتَغيّرات من نوع المَرجِع كمُعامِلات للدوال تمريرًا مَرجعيًا (pass by reference)، أي يُنسَخ مَرجِع المُتَغيّر ويُسند لمُعامِل الدالة. لمّا كانت الدالة تَملِك مُعاملًا يَحمِل مَرجِعًا يُشير إلى الكائن الأصلي ذاته، فإنها إذا غَيرَّت قيمة المُعامِل فإن هذا التَغيير سيَنعكِس على قيمة المُتَغيّر الأصلي خارج الدالة.
</p>

<p>
	في الشيفرة التالية، نَستخدِم نفس المثال السابق لكن ضُمِنِّت المُتَغيّرات من النوع <code>int</code> بداخل صنف <code>class</code>، بحيث تَستقبِل الدالة مُعامِلًا من ذلك الصنف.
</p>

<p>
	الآن، عندما تُغيّر الدالة قيمة المُتَغيّر <code>sample.a</code>، فإن قيمة المُتَغيّر <code>instanceOfMyClass.a</code> ستَتَغيَّر تلقائيًا؛ لأن مُعامِل الدالة، في الواقع، يَحمِل مَرجِعًا يُشير إلى نفس ذات الكائن المُمرَّر لها، وليس مُجرد نسخة منه.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_9778_20" style="">
<span class="typ">MyClass</span><span class="pln"> instanceOfMyClass </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">MyClass</span><span class="pun">();</span><span class="pln">
instanceOfMyClass</span><span class="pun">.</span><span class="pln">a </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln">
instanceOfMyClass</span><span class="pun">.</span><span class="pln">b </span><span class="pun">=</span><span class="pln"> </span><span class="lit">6</span><span class="pun">;</span><span class="pln">

</span><span class="typ">AddNumbers</span><span class="pun">(</span><span class="pln">instanceOfMyClass</span><span class="pun">);</span><span class="pln">

</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">AddNumbers</span><span class="pun">(</span><span class="typ">MyClass</span><span class="pln"> sample</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> z </span><span class="pun">=</span><span class="pln"> sample</span><span class="pun">.</span><span class="pln">a </span><span class="pun">+</span><span class="pln"> sample</span><span class="pun">.</span><span class="pln">b</span><span class="pun">;</span><span class="pln"> </span><span class="com">// قيمة المتغير‫ z تساوي 11</span><span class="pln">
    sample</span><span class="pun">.</span><span class="pln">a </span><span class="pun">=</span><span class="pln"> sample</span><span class="pun">.</span><span class="pln">a </span><span class="pun">+</span><span class="pln"> </span><span class="lit">5</span><span class="pun">;</span><span class="pln"> </span><span class="com">// ‫غُيرت قيمة a إلى القيمة 10</span><span class="pln">
    z </span><span class="pun">=</span><span class="pln"> sample</span><span class="pun">.</span><span class="pln">a </span><span class="pun">+</span><span class="pln"> sample</span><span class="pun">.</span><span class="pln">b</span><span class="pun">;</span><span class="pln"> </span><span class="com">// قيمة المتغير‫ z تساوي 16</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ترجمة -وبتصرف- للفصلين Custom Types و Stack and Heap من كتاب <a href="https://goalkicker.com/DotNETFrameworkBook/" rel="external nofollow">‎.NET Framework Notes for Professionals</a>
</p>
]]></description><guid isPermaLink="false">946</guid><pubDate>Tue, 28 Jul 2020 12:57:01 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62C;&#x645;&#x64A;&#x639;&#x627;&#x62A; (Collections) &#x641;&#x64A; dot NET</title><link>https://academy.hsoub.com/programming/c-sharp/dotnet/%D8%A7%D9%84%D8%AA%D8%AC%D9%85%D9%8A%D8%B9%D8%A7%D8%AA-collections-%D9%81%D9%8A-dot-net-r947/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_07/4.png.df10ba4db86a1978bc7adda4f225a225.png" /></p>

<h2>
	مهيئ التجميعات (Collection Initializers)
</h2>

<p>
	يُمكِن تَهيِّئة (Initialize) بعض أنواع التَجمِيعَات أثناء التصريح (declaration) عنها. على سبيل المثال، تُنشِئ التَعلِيمَة البرمجية التالية المُتغَير <code>numbers</code> وتُهيِّئه بمجموعة أعداد (integers):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_7" style="">
<span class="typ">List</span><span class="str">&lt;int&gt;</span><span class="pln"> numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="str">&lt;int&gt;</span><span class="pun">(){</span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">};</span></pre>

<p>
	في الواقع، يُحوِل مُصرِّف ‎(Compiler) c‎#‎ تَعلِيمَة التَهيِّئة السابقة لسلسلة استدعاءات للتابع <code>Add</code>. بناءً على ذلك، لا يُمكِن استخدام هذه الصِيْغة (syntax) إلا مع التَجمِيعَات التي تُدعِم التابع <code>Add</code>.
</p>

<p>
	لاحظ أن صَنفيّ المَكْدَس <code>Stack&lt;T&gt;‎</code> والرَتَل <code>Queue&lt;T&gt;‎</code> لا يُدعِمَانِها.
</p>

<p>
	عِند التَعامُل مع التَجمِيعَات المُعقدة مِثل <code>Dictionary&lt;TKey, TValue&gt;‎</code>، المُكَوّنة مِن أزواج مفتاح/قيمة (key/value pairs)، يُحدَّد كل زوج كنوع مَجهول الاسم (anonymous type) بقائمة التَهيِّئة (initializer list)، كالآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_9" style="">
<span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;</span><span class="pln"> employee </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;()</span><span class="pln">
</span><span class="pun">{{</span><span class="lit">44</span><span class="pun">,</span><span class="pln"> </span><span class="str">"John"</span><span class="pun">},</span><span class="pln"> </span><span class="pun">{</span><span class="lit">45</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Bob"</span><span class="pun">},</span><span class="pln"> </span><span class="pun">{</span><span class="lit">47</span><span class="pun">,</span><span class="pln"> </span><span class="str">"James"</span><span class="pun">},</span><span class="pln"> </span><span class="pun">{</span><span class="lit">48</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Franklin"</span><span class="pun">}};</span></pre>

<p>
	العنصر الأول بكل زوج هو المفتاح (key) بينما الثاني هو القيمة (value).
</p>

<h2>
	القائمة (List)
</h2>

<h3>
	قائمة من أنواع أولية (Primitive)
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_11" style="">
<span class="typ">List</span><span class="str">&lt;int&gt;</span><span class="pln"> numbers </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="str">&lt;int&gt;</span><span class="pun">(){</span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">};</span></pre>

<h3>
	قائمة من أنواع مخصصة (Custom Types) وتهيئتها
</h3>

<p>
	تُعرِّف الشيفرة التالية الصَنف <code>Model</code>، الذي يحتوي على خاصيتي <code>Name</code> و <code>Selected</code> من النوع <code>nullable boolean</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_13" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Model</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">bool</span><span class="pun">?</span><span class="pln"> </span><span class="typ">Selected</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	توجد عدة طرائق لتَهيِّئة قائمة List<model>‎ من الصنف <code>Model</code>. إذا لم يُعرَّف بَانِي الكائن (Constructor) بالصنف كالشيفرة بالأعلى، تُنشَّئ نسخ جديدة من الصنف <code>Model</code> وتُهيَّئ كالتالي: </model></p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_15" style="">
<span class="pln">var </span><span class="typ">SelectedEmployees</span><span class="pln"> </span><span class="pun">=</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Model</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Item1"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Selected</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Model</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Item2"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Selected</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Model</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Item3"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Selected</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Model</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Item4"</span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	أما لو عُرِّف بَانِي الكائن (Constructor) بالصَنف كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_17" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Model</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Model</span><span class="pun">(</span><span class="pln">string name</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">bool</span><span class="pun">?</span><span class="pln"> selected </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">false</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> name</span><span class="pun">;</span><span class="pln">
        selected </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Selected</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">bool</span><span class="pun">?</span><span class="pln"> </span><span class="typ">Selected</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يَسمَح ذلك بتَهيِّئة القائمة بشكل مختلف قليلًا، كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_19" style="">
<span class="pln">var </span><span class="typ">SelectedEmployees</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">Model</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Model</span><span class="pun">(</span><span class="str">"Mark"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">),</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Model</span><span class="pun">(</span><span class="str">"Alexis"</span><span class="pun">),</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Model</span><span class="pun">(</span><span class="str">""</span><span class="pun">)</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	ماذا عن صنف إِحِدى خواصه هي صنف بذاته؟ مثلًا:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_21" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Model</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">bool</span><span class="pun">?</span><span class="pln"> </span><span class="typ">Selected</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ExtendedModel</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="typ">Model</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">ExtendedModel</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">BaseModel</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Model</span><span class="pun">();</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">Model</span><span class="pln"> </span><span class="typ">BaseModel</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pln"> </span><span class="typ">BirthDate</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لتبسِيط المثال قليلًا، أُزيِل بَانِي الكائن (constructor) من الصنف <code>Model</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_23" style="">
<span class="pln">var </span><span class="typ">SelectedWithBirthDate</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">ExtendedModel</span><span class="pun">&gt;</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ExtendedModel</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">BaseModel</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Model</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Mark"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Selected</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">true</span><span class="pun">},</span><span class="pln">
        </span><span class="typ">BirthDate</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="lit">2015</span><span class="pun">,</span><span class="pln"> </span><span class="lit">11</span><span class="pun">,</span><span class="pln"> </span><span class="lit">23</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ExtendedModel</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="typ">BaseModel</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Model</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Random"</span><span class="pun">},</span><span class="pln">
        </span><span class="typ">BirthDate</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">(</span><span class="lit">2015</span><span class="pun">,</span><span class="pln"> </span><span class="lit">11</span><span class="pun">,</span><span class="pln"> </span><span class="lit">23</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بالمِثل، يُمكِن تطبيق ذلك على الأصناف <code>Collection&lt;ExtendedModel&gt;‎</code> أو <code>ExtendedModel[]‎</code> و <code>object[]‎</code> أو <code>[]</code>.
</p>

<h2>
	المكدس (Stack)
</h2>

<p>
	تُدعِم ‎.NET تَجمِيعَة <a href="https://msdn.microsoft.com/library/system.collections.stack(v=vs.110).aspx" rel="external nofollow">المَكْدَس (Stack)</a>، وهي هيكل بياني (data structure) لإدارة مجموعة من القيم اِعتمادًا على مفهوم <a href="https://en.wikipedia.org/wiki/Stack_(abstract_data_type)" rel="external nofollow">“الداخل آخرًا، يخرج أولًا“ (LIFO)</a>. يُدخِل التابع <a href="https://msdn.microsoft.com/library/system.collections.stack.push(v=vs.110).aspx" rel="external nofollow">Push(T item)</a> العناصر للمَكْدَس، بينما يُخرِج التابع <a href="https://msdn.microsoft.com/library/system.collections.stack.pop(v=vs.110).aspx" rel="external nofollow">Pop()</a> آخر عنصر تَمْ إدخاله للمَكْدَس، ويَحذِفه منه.
</p>

<p>
	تُوضِح الشيفرة التالية استخدام النسخة المُعمَّمة (Generic) من المَكْدَس لإدارة مجموعة سلاسل نصية. قم أولًا بإضافة فَضَاء الاسم (namespace):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_25" style="">
<span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span></pre>

<p>
	ثم استخدمه:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_27" style="">
<span class="typ">Stack</span><span class="str">&lt;string&gt;</span><span class="pln"> </span><span class="typ">stack</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Stack</span><span class="str">&lt;string&gt;</span><span class="pun">();</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="str">"John"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="str">"Paul"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="str">"George"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="str">"Ringo"</span><span class="pun">);</span><span class="pln">


string value</span><span class="pun">;</span><span class="pln">
value </span><span class="pun">=</span><span class="pln"> </span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Pop</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return Ringo</span><span class="pln">
value </span><span class="pun">=</span><span class="pln"> </span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Pop</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return George</span><span class="pln">
value </span><span class="pun">=</span><span class="pln"> </span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Pop</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return Paul</span><span class="pln">
value </span><span class="pun">=</span><span class="pln"> </span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Pop</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return John</span></pre>

<p>
	يُوجد نسخة غير مُعمَّمة من المَكْدَس تَتَعَامَل مع الكائنات (objects). أضِف فَضَاء الاسم:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_29" style="">
<span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">;</span></pre>

<p>
	تُوضح الشيفرة التالية استخدام مَكْدَس غير مُعمَّم:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_31" style="">
<span class="typ">Stack</span><span class="pln"> </span><span class="typ">stack</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Stack</span><span class="pun">();</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="str">"Hello World"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="lit">5</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="lit">1d</span><span class="pun">);</span><span class="pln"> </span><span class="com">// double</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> </span><span class="com">// bool</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Product</span><span class="pun">());</span><span class="pln"> </span><span class="com">// Product object</span><span class="pln">


object value</span><span class="pun">;</span><span class="pln">
value </span><span class="pun">=</span><span class="pln"> </span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Pop</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return Product (Product type)</span><span class="pln">
value </span><span class="pun">=</span><span class="pln"> </span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Pop</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return true (bool)</span><span class="pln">
value </span><span class="pun">=</span><span class="pln"> </span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Pop</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return 1d (double)</span><span class="pln">
value </span><span class="pun">=</span><span class="pln"> </span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Pop</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return 5 (int)</span><span class="pln">
value </span><span class="pun">=</span><span class="pln"> </span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Pop</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return Hello World (string)</span></pre>

<p>
	بخلاف التابع <code>Pop()‎</code>، يُخرِج التابع <a href="https://msdn.microsoft.com/library/system.collections.stack.peek(v=vs.110).aspx" rel="external nofollow">Peek()</a><code>‎</code> آخر عنصر تَمْ إدخاله للمَكْدَس دون حَذفه منه.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_33" style="">
<span class="typ">Stack</span><span class="str">&lt;int&gt;</span><span class="pln"> </span><span class="typ">stack</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Stack</span><span class="str">&lt;int&gt;</span><span class="pun">();</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="lit">20</span><span class="pun">);</span><span class="pln">
var lastValueAdded </span><span class="pun">=</span><span class="pln"> </span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Peek</span><span class="pun">();</span><span class="pln"> </span><span class="com">// 20</span></pre>

<p>
	يُطبّق التِكرار (iterate) على عناصر المَكْدَس وفقًا لمفهوم “الداخل آخرًا، يخرج أولًا“ (LIFO) وبدون حذفها، كاﻵتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_35" style="">
<span class="typ">Stack</span><span class="str">&lt;int&gt;</span><span class="pln"> </span><span class="typ">stack</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Stack</span><span class="str">&lt;int&gt;</span><span class="pun">();</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="lit">20</span><span class="pun">);</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="lit">30</span><span class="pun">);</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="lit">40</span><span class="pun">);</span><span class="pln">
</span><span class="typ">stack</span><span class="pun">.</span><span class="typ">Push</span><span class="pun">(</span><span class="lit">50</span><span class="pun">);</span><span class="pln">


foreach </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> element in </span><span class="typ">stack</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">element</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	خَرْج الشيفرة باﻷعلى يكون كالتالي:
</p>

<pre class="ipsCode">
50
40
30
20
10
</pre>

<h2>
	الرتل (Queue)
</h2>

<p>
	تُدعِم ‎.NET تَجمِيعَة <a href="https://msdn.microsoft.com/library/system.collections.queue(v=vs.110).aspx" rel="external nofollow">الرَتَل (Queue)</a>، وهي هيكل بياني (data structure) لإدارة مجموعة من القيم اِعتمادًا على مفهوم <a href="https://en.wikipedia.org/wiki/FIFO_(computing_and_electronics)" rel="external nofollow">“الداخل أولًا، يخرج أولًا“ (FIFO)</a>. يُدخِل التابع <a href="https://msdn.microsoft.com/library/t249c2y7(v=vs.110).aspx" rel="external nofollow">Enqueue(T item)</a> العناصر للرَتَل، بينما يُخرِج التابع <a href="https://msdn.microsoft.com/library/1c8bzx97(v=vs.110).aspx" rel="external nofollow">Dequeue()</a> أول عنصر من الرَتَل، ويَحذِفه منه.
</p>

<p>
	توضح الشيفرة التالية استخدام النسخة المُعمَّمة (Generic) من رَتَل لإدارة مجموعة سلاسل النصية. قم أولًا بإضافة فَضَاء الاسم (namespace):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_37" style="">
<span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span></pre>

<p>
	ثم استخدمه:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_39" style="">
<span class="typ">Queue</span><span class="str">&lt;string&gt;</span><span class="pln"> </span><span class="typ">queue</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Queue</span><span class="str">&lt;string&gt;</span><span class="pun">();</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="str">"John"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="str">"Paul"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="str">"George"</span><span class="pun">);</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="str">"Ringo"</span><span class="pun">);</span><span class="pln">


string dequeueValue</span><span class="pun">;</span><span class="pln">
dequeueValue </span><span class="pun">=</span><span class="pln"> </span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Dequeue</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return John</span><span class="pln">
dequeueValue </span><span class="pun">=</span><span class="pln"> </span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Dequeue</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return Paul</span><span class="pln">
dequeueValue </span><span class="pun">=</span><span class="pln"> </span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Dequeue</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return George</span><span class="pln">
dequeueValue </span><span class="pun">=</span><span class="pln"> </span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Dequeue</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return Ringo</span></pre>

<p>
	يُوجد نسخة غير مُعمَّمة من الرَتَل تَتَعَامَل مع الكائنات (objects). بالمِثل، أضف فضاء الاسم:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_41" style="">
<span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">;</span></pre>

<p>
	تُوضح الشيفرة التالية استخدام رَتَل غير مُعمَّم:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_43" style="">
<span class="typ">Queue</span><span class="pln"> </span><span class="typ">queue</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Queue</span><span class="pun">();</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="str">"Hello World"</span><span class="pun">);</span><span class="pln"> </span><span class="com">// string</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="lit">5</span><span class="pun">);</span><span class="pln"> </span><span class="com">// int</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="lit">1d</span><span class="pun">);</span><span class="pln"> </span><span class="com">// double</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="kwd">true</span><span class="pun">);</span><span class="pln"> </span><span class="com">// bool</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Product</span><span class="pun">());</span><span class="pln"> </span><span class="com">// Product object</span><span class="pln">


object dequeueValue</span><span class="pun">;</span><span class="pln">
dequeueValue </span><span class="pun">=</span><span class="pln"> </span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Dequeue</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return Hello World (string)</span><span class="pln">
dequeueValue </span><span class="pun">=</span><span class="pln"> </span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Dequeue</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return 5 (int)</span><span class="pln">
dequeueValue </span><span class="pun">=</span><span class="pln"> </span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Dequeue</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return 1d (double)</span><span class="pln">
dequeueValue </span><span class="pun">=</span><span class="pln"> </span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Dequeue</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return true (bool)</span><span class="pln">
dequeueValue </span><span class="pun">=</span><span class="pln"> </span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Dequeue</span><span class="pun">();</span><span class="pln"> </span><span class="com">// return Product (Product type)</span></pre>

<p>
	بخلاف التابع <code>Dequeue()‎</code>، يُخرِج التابع <a href="https://msdn.microsoft.com/library/system.collections.queue.peek(v=vs.110).aspx" rel="external nofollow">Peek()</a><code>‎</code> أول عنصر بالرَتَل دون حَذفه منه.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_45" style="">
<span class="typ">Queue</span><span class="str">&lt;int&gt;</span><span class="pln"> </span><span class="typ">queue</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Queue</span><span class="str">&lt;int&gt;</span><span class="pun">();</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="lit">20</span><span class="pun">);</span><span class="pln">
var lastValueAdded </span><span class="pun">=</span><span class="pln"> </span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Peek</span><span class="pun">();</span><span class="pln"> </span><span class="com">// 10</span></pre>

<p>
	يُطبّق التِكرار (iterate) على عناصر الرَتَل وفقًا لمفهوم “الداخل أولًا، يخرج أولًا“ (FIFO) وبدون حذفها، كاﻵتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_47" style="">
<span class="typ">Queue</span><span class="str">&lt;int&gt;</span><span class="pln"> </span><span class="typ">queue</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Queue</span><span class="str">&lt;int&gt;</span><span class="pun">();</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="lit">20</span><span class="pun">);</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="lit">30</span><span class="pun">);</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="lit">40</span><span class="pun">);</span><span class="pln">
</span><span class="typ">queue</span><span class="pun">.</span><span class="typ">Enqueue</span><span class="pun">(</span><span class="lit">50</span><span class="pun">);</span><span class="pln">


foreach </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> element in </span><span class="typ">queue</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">i</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	خَرْج الشيفرة باﻷعلى يكون كالتالي:
</p>

<pre class="ipsCode">
10
20
30
40
50
</pre>

<h2>
	القاموس (Dictionary)
</h2>

<h3>
	تهيئة القاموس
</h3>

<p>
	باستخدام مُهَيِّئ التَجمِيعَات (Collection Initializer):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_49" style="">
<span class="com">// Translates to `dict.Add(1, "First")` etc.</span><span class="pln">
var dict </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="pun">{</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"First"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Second"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Third"</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


</span><span class="com">// Translates to `dict[1] = "First"` etc.</span><span class="pln">
</span><span class="com">// Works in C# 6.0.</span><span class="pln">
var dict </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"First"</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Second"</span><span class="pun">,</span><span class="pln">
    </span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Third"</span><span class="pln">
</span><span class="pun">};</span></pre>

<h3>
	الإضافة للقاموس
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_51" style="">
<span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;</span><span class="pln"> dict </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;();</span><span class="pln">
dict</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"First"</span><span class="pun">);</span><span class="pln">
dict</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Second"</span><span class="pun">);</span><span class="pln">


</span><span class="com">// To safely add items (check to ensure item does not already exist - would throw)</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(!</span><span class="pln">dict</span><span class="pun">.</span><span class="typ">ContainsKey</span><span class="pun">(</span><span class="lit">3</span><span class="pun">))</span><span class="pln"> 
</span><span class="pun">{</span><span class="pln">
    dict</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Third"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يُمكِن للمُفهرِس (Indexer) الإضافة للقاموس أيضًا كبديل عن التابع <code>Add</code>. يَبدو المُفهرِس، من الداخل، كأيّ خَاصية (Property) تَملُك جَالِب (getter) وضَابِط (setter) خاص بها، بِخلاف كونهما يَستقبِلان مُعامِلات من أي نوع تُحدِّد بين قوْسين مَعقُوفَين <code>[]</code>.
</p>

<p>
	لاحظ المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_53" style="">
<span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;</span><span class="pln"> dict </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;();</span><span class="pln">
dict</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"First"</span><span class="pun">;</span><span class="pln">
dict</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Second"</span><span class="pun">;</span><span class="pln">
dict</span><span class="pun">[</span><span class="lit">3</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Third"</span><span class="pun">;</span></pre>

<p>
	عِند مُحاولة إضافة عنصر مفتاحه (Key) مَوجُود مُسبَقًا بالقاموس، يَستبدِل المُفهرِس القيمة الجديدة بالقيمة الموجودة، هذا بِخلاف التابع <code>Add</code> الذي يُبلِّغ عن اعتراض (Exception).
</p>

<p>
	لتَنشِئة قاموس آمن خيطيًا، استخدم الصنف <code>ConcurrentDictionary&lt;TKey, TValue&gt;‎</code>، كالآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_57" style="">
<span class="pln">var dict </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ConcurrentDictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;();</span><span class="pln">
dict</span><span class="pun">.</span><span class="typ">AddOrUpdate</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"First"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">oldKey</span><span class="pun">,</span><span class="pln"> oldValue</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"First"</span><span class="pun">);</span></pre>

<h3>
	جلب قيمة من القاموس
</h3>

<p>
	انظر لشيفرة التهيئة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_55" style="">
<span class="pln">var dict </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="pun">{</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"First"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Second"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Third"</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	قَبل مُحاولة استخدام مفتاح (key) لجَلْب قيمته (value) المُناظِرة من القاموس، يُمكِنك أولًا استخدام التابع <code>ContainsKey</code> لاختبار وُجُود المفتاح؛ وذلك لِتجَنُب التَبلِّيغ عن اعتراض من النوع <code>KeyNotFoundException</code> في حالة عَدَم وُجُود المفتاح.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_59" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">dict</span><span class="pun">.</span><span class="typ">ContainsKey</span><span class="pun">(</span><span class="lit">1</span><span class="pun">))</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">dict</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]);</span></pre>

<p>
	تُعانِي الشيفرة باﻷعلى، مع ذلك، مِن عَيْب البَحَث بالقاموس مَرتين (مرَّة لاختبار وجود المفتاح ومرَّة للجَلْب الفِعلِيّ للقيمة). إذا كان القاموس (Dictionary) كبيرًا، فسيُؤثِر ذلك على مستوى أداء الشيفرة. لحسن الحظ، يُمكِن للتابع <code>TryGetValue</code> إجراء العَمليتين (البحث والجَلْب) سَويًا، كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_61" style="">
<span class="pln">string value</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">dict</span><span class="pun">.</span><span class="typ">TryGetValue</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> out value</span><span class="pun">))</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">value</span><span class="pun">);</span></pre>

<h3>
	جعل القاموس <code>Dictionary&lt;string, T&gt;‎</code> لا يَتأثَر بحالة حروف المفاتيح (keys)
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_63" style="">
<span class="pln">var </span><span class="typ">MyDict</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="pln">string</span><span class="pun">,</span><span class="pln">T</span><span class="pun">&gt;(</span><span class="typ">StringComparison</span><span class="pun">.</span><span class="typ">InvariantCultureIgnoreCase</span><span class="pun">)</span></pre>

<h3>
	تعديد (Enumerating) القاموس
</h3>

<p>
	يُمكِنك تَعديد قاموس بِطَرِيقة مِن ثَلَاث:
</p>

<ul>
<li>
		الطريقة اﻷولى: استخدام أزواج <code>KeyValue</code>:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_66" style="">
<span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;</span><span class="pln"> dict </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;();</span><span class="pln">
foreach</span><span class="pun">(</span><span class="typ">KeyValuePair</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;</span><span class="pln"> kvp in dict</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Key : "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> kvp</span><span class="pun">.</span><span class="typ">Key</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">", Value : "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> kvp</span><span class="pun">.</span><span class="typ">Value</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<ul>
<li>
		الطريقة الثانية: استخدام الخاصية <code>Keys</code>:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_68" style="">
<span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;</span><span class="pln"> dict </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;();</span><span class="pln">
foreach</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> key in dict</span><span class="pun">.</span><span class="typ">Keys</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Key : "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> key</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">()</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="str">", Value : "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> dict</span><span class="pun">[</span><span class="pln">key</span><span class="pun">]);</span><span class="pln">
</span><span class="pun">}</span></pre>

<ul>
<li>
		الطريقة الثالثة: استخدام الخاصية <code>Values</code>:
	</li>
</ul>
<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_70" style="">
<span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;</span><span class="pln"> dict </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;();</span><span class="pln">
foreach</span><span class="pun">(</span><span class="pln">string s in dict</span><span class="pun">.</span><span class="typ">Values</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Value : "</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> s</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	تحويل الواجهة <code>IEnumerable</code> إلى قاموس
</h3>

<p>
	<em>إصدار ‎.NET 3.5 أو أحدث</em>
</p>

<p>
	يُنشئ التابع <code>ToDictionary</code> نُسخَة من النوع <a href="https://msdn.microsoft.com/en-us/library/xfhwa508(v=vs.100).aspx" rel="external nofollow">Dictionary<tkey tvalue=""></tkey>,&gt;</a> من الواجهة <a href="https://msdn.microsoft.com/en-us/library/9eekhta0(v=vs.100).aspx" rel="external nofollow">IEnumerable<t></t></a> كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_72" style="">
<span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Collections</span><span class="pun">.</span><span class="typ">Generic</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Linq</span><span class="pun">;</span><span class="pln">


</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Fruits</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


var fruits </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pun">[]</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Fruits</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">8</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Apple"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Fruits</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">3</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Banana"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Fruits</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Id</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pln"> </span><span class="pun">,</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Mango"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
</span><span class="pun">};</span><span class="pln">


</span><span class="com">// Dictionary&lt;int, string&gt;</span><span class="pln">
key
    value
    var dictionary </span><span class="pun">=</span><span class="pln"> fruits</span><span class="pun">.</span><span class="typ">ToDictionary</span><span class="pun">(</span><span class="pln">x </span><span class="pun">=&gt;</span><span class="pln"> x</span><span class="pun">.</span><span class="typ">Id</span><span class="pun">,</span><span class="pln"> x </span><span class="pun">=&gt;</span><span class="pln"> x</span><span class="pun">.</span><span class="typ">Name</span><span class="pun">);</span></pre>

<h3>
	تحويل القاموس إلى قائِمة (List)
</h3>

<p>
	تَنشِّئة قائمة من زوج مفتاح/قيمة <code>KeyValuePair</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_74" style="">
<span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pun">&gt;</span><span class="pln"> dictionary </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pun">&gt;();</span><span class="pln">
</span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">KeyValuePair</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="typ">list</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">KeyValuePair</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pun">&gt;&gt;();</span><span class="pln">
</span><span class="typ">list</span><span class="pun">.</span><span class="typ">AddRange</span><span class="pun">(</span><span class="pln">dictionary</span><span class="pun">);</span></pre>

<p>
	تَنشِّئة قائمة من مفاتيح القاموس (keys):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_76" style="">
<span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pun">&gt;</span><span class="pln"> dictionary </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pun">&gt;();</span><span class="pln">
</span><span class="typ">List</span><span class="str">&lt;int&gt;</span><span class="pln"> </span><span class="typ">list</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="str">&lt;int&gt;</span><span class="pun">();</span><span class="pln">
</span><span class="typ">list</span><span class="pun">.</span><span class="typ">AddRange</span><span class="pun">(</span><span class="pln">dictionary</span><span class="pun">.</span><span class="typ">Keys</span><span class="pun">);</span></pre>

<p>
	تَنشِّئة قائمة من قيم القاموس (values):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_78" style="">
<span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pun">&gt;</span><span class="pln"> dictionary </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pun">&gt;();</span><span class="pln">
</span><span class="typ">List</span><span class="str">&lt;int&gt;</span><span class="pln"> </span><span class="typ">list</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="str">&lt;int&gt;</span><span class="pun">();</span><span class="pln">
</span><span class="typ">list</span><span class="pun">.</span><span class="typ">AddRange</span><span class="pun">(</span><span class="pln">dictionary</span><span class="pun">.</span><span class="typ">Values</span><span class="pun">);</span></pre>

<h3>
	الحذف من القاموس
</h3>

<p>
	انظر لشيفرة التهيئة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_80" style="">
<span class="pln">var dict </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="pun">{</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"First"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="pln"> </span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Second"</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Third"</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	يَحذِف التابع <code>Remove</code> مفتاحًا مُعَيَنًا وقِيمته من القاموس كالآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_82" style="">
<span class="kwd">bool</span><span class="pln"> wasRemoved </span><span class="pun">=</span><span class="pln"> dict</span><span class="pun">.</span><span class="typ">Remove</span><span class="pun">(</span><span class="lit">2</span><span class="pun">);</span></pre>

<p>
	يُعِيد التابع <code>Remove</code> قِيمَة مِن النوع <code>boolean</code>، تكون <code>true</code> إذا ما وَجَدَ التابع المفتاح المُحدَّد واستطاع حَذفُه من القاموس. أو تكون <code>false</code> إذا لم يَجِده (مما يعّنِي أنه لا يُبلِّغ عن اعتراض).
</p>

<p>
	من غَيْر الصحيح أن تُحِاول حَذْف مفتاح من القاموس بإِسنَاد القيمة الفارغة <code>null</code> إليه، كالآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_84" style="">
<span class="com">// WRONG WAY TO REMOVE!</span><span class="pln">
dict</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> null</span><span class="pun">;</span><span class="pln"> </span></pre>

<p>
	سَتَستبدِل الشيفرة باﻷعلى القيمة الفارغة <code>null</code> بقيمة المفتاح السابقة فقط دُون الحَذفُ الفِعِلِّي للمفتاح.
</p>

<p>
	استخدم التابع <code>Clear</code> لحذف جميع المفاتيح والقيم من القاموس، كالآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_86" style="">
<span class="pln">dict</span><span class="pun">.</span><span class="typ">Clear</span><span class="pun">();</span></pre>

<p>
	بالرغم من أن التابع <code>Clear</code> يُحرِر جميع مَراجِع العناصر الموجودة بالقاموس، ويُعيد ضَبْط قيمة الخاصية <code>Count</code> للصفر، فإنه لا يُحرِر سَعَة المصفوفة الداخلية وتظل كما هي.
</p>

<h3>
	فحص وجود مفتاح بالقاموس
</h3>

<p>
	يُجري التابع <a href="https://msdn.microsoft.com/library/htszx2dy(v=vs.110).aspx" rel="external nofollow">ContainsKey(TKey)</a><code>‎</code> اختبار وُجُود مفتاح (key) بقاموس (Dictionary). يُمَرَّر المفتاح كمُعامِل من النوع <code>TKey</code> للتابع الذي يُعيد قيمة منطقية <code>bool</code> تُحدد ما إذا كان المفتاح موجودًا أم لا.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_89" style="">
<span class="pln">var dictionary </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Dictionary</span><span class="pun">&lt;</span><span class="pln">string</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Customer</span><span class="pun">&gt;()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"F1"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Customer</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Felipe"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...}},</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"C2"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Customer</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Carl"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...</span><span class="pln"> </span><span class="pun">}},</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"J7"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Customer</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"John"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...</span><span class="pln"> </span><span class="pun">}},</span><span class="pln">
    </span><span class="pun">{</span><span class="str">"M5"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Customer</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Mary"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">...</span><span class="pln"> </span><span class="pun">}},</span><span class="pln">
</span><span class="pun">};</span></pre>

<p>
	لاختبار وجود المفتاح <code>C2</code> بالقاموس:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_91" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">dictionary</span><span class="pun">.</span><span class="typ">ContainsKey</span><span class="pun">(</span><span class="str">"C2"</span><span class="pun">))</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// exists</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تُدعِم النُسخة المُعمَّمة (Generic) من القاموس <a href="https://msdn.microsoft.com/library/htszx2dy(v=vs.110).aspx" rel="external nofollow">Dictionary<tkey tvalue=""></tkey>,&gt;</a> هذا التابع <code>ContainsKey</code> أيضًا.
</p>

<h2>
	القاموس المتزامن <code>ConcurrentDictionary&lt;TKey, TValue&gt;‎</code>
</h2>

<p>
	يتوفَّر -منذ إصدار .NET 4.0 أو أحدث- القاموس المُتَزَامِن وهو تَجمِيعة آمِنة خيطيًا (thread-safe) مُكوَّنة مِن أزواج مفتاح/قيمة (key/value pairs)، بحيث يمكن لخُيُوط (threads) مُتعدِّدة أن تَلِج إليها وُلُوجًا مُتَزَامِنًا.
</p>

<h3>
	إنشاء نسخة
</h3>

<p>
	مِثِل تَنشِئة نسخة من <code>Dictionary&lt;TKey, TValue&gt;‎</code>، كالآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_93" style="">
<span class="pln">var dict </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ConcurrentDictionary</span><span class="pun">&lt;</span><span class="typ">int</span><span class="pun">,</span><span class="pln"> string</span><span class="pun">&gt;();</span></pre>

<h3>
	إِضافة أو تحدِيث
</h3>

<p>
	ربما تُفَاجئ بِعَدَم وجود تابع <code>Add</code>، حيث يُجرِي التابع <code>AddOrUpdate</code> كِلَا العَمَليتين. في الواقع، تتوفر بصمتين (Method Overloading) من التابع <code>AddOrUpdate</code>.
</p>

<p>
	اﻷولى:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_95" style="">
<span class="typ">AddOrUpdate</span><span class="pun">(</span><span class="typ">TKey</span><span class="pln"> key</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TValue</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Func</span><span class="pun">&lt;</span><span class="typ">TKey</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TValue</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TValue</span><span class="pun">&gt;</span><span class="pln"> addValue</span><span class="pun">)‎</span><span class="pln">
</span></pre>

<p>
	إذا لم يَكُن المفتاح موجودًا مُسبَقًا، يُضِيف هذا الشكل من التابع زوج مفتاح/قيمة جديد. أما إذا كان موجودًا، يُحدِّثه مُعامِل الدالة المُمَرَّر للتابع <code>addValue</code>.
</p>

<p>
	الثانية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_97" style="">
<span class="typ">AddOrUpdate</span><span class="pun">(</span><span class="typ">TKey</span><span class="pln"> key</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Func</span><span class="pun">&lt;</span><span class="typ">TKey</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TValue</span><span class="pun">&gt;</span><span class="pln"> addValue</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Func</span><span class="pun">&lt;</span><span class="typ">TKey</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TValue</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TValue</span><span class="pun">&gt;</span><span class="pln"> updateValueFactory</span><span class="pun">)‎</span><span class="pln">
</span></pre>

<p>
	تُحَدِث أو تُضيِف مُعامِلات الدوال، المُمَرَّرة لهذا الشكل من التابع، زوج مفتاح/قيمة (key/value pair) إذا كان المفتاح موجودًا مسبقًا أم لا على الترتيب.
</p>

<p>
	تُضُيِف أو تُحَدِث البصمة الأولى من التابع قيمة مُفتاح مُعين بغض النظر عن القيمة السابقة إن وُجِدّت، كالآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_99" style="">
<span class="pln">string addedValue </span><span class="pun">=</span><span class="pln"> dict</span><span class="pun">.</span><span class="typ">AddOrUpdate</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"First"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">updateKey</span><span class="pun">,</span><span class="pln"> valueOld</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="str">"First"</span><span class="pun">);</span></pre>

<p>
	كالمثال باﻷعلى، تُضُيِف البصمة الأول من التابع قيمة مفتاح معين، لكنها في حالة التحديث، تَعتمِد على القيمة السابقة للمفتاح كالآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_101" style="">
<span class="pln">string addedValue2 </span><span class="pun">=</span><span class="pln"> dict</span><span class="pun">.</span><span class="typ">AddOrUpdate</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="str">"First"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">updateKey</span><span class="pun">,</span><span class="pln"> valueOld</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $</span><span class="str">"{valueOld} Updated"</span><span class="pun">);</span></pre>

<p>
	يُمكِن للبصمة الثانية من التابع الإضافة أيضًا من خلال مُعامِل دَالة مُمَرَّر لها كالآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_103" style="">
<span class="pln">string addedValue3 </span><span class="pun">=</span><span class="pln"> dict</span><span class="pun">.</span><span class="typ">AddOrUpdate</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">key</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> key </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="str">"First"</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">"Not First"</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">updateKey</span><span class="pun">,</span><span class="pln"> valueOld</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> $</span><span class="str">"{valueOld} Updated"</span><span class="pun">);</span></pre>

<h3>
	جلب قيمة (value)
</h3>

<p>
	مثل جَلْب قيمة من <code>Dictionary&lt;TKey, TValue&gt;‎</code>، كالآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_105" style="">
<span class="pln">string value </span><span class="pun">=</span><span class="pln"> null</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">bool</span><span class="pln"> success </span><span class="pun">=</span><span class="pln"> dict</span><span class="pun">.</span><span class="typ">TryGetValue</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> out value</span><span class="pun">);</span></pre>

<h3>
	جلب مع إضافة قيمة
</h3>

<p>
	تتوفر بصمتين من التابع <code>GetOrAdd</code> لجلب قيمة مفتاح معين أو إضافته للقاموس بطريقة آمِنة خيطيًا.
</p>

<p>
	تَجلْب البصمة الأولى من التابع <code>GetOrAdd</code> قيمة المفتاح <code>2</code> أو تضيفها إن لم يكن المفتاح موجودًا بالقاموس كالآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_109" style="">
<span class="pln">string theValue </span><span class="pun">=</span><span class="pln"> dict</span><span class="pun">.</span><span class="typ">GetOrAdd</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Second"</span><span class="pun">);</span></pre>

<p>
	كالمثال السابق، تَجلْب البصمة الثانية من التابع قيمة المفتاح <code>2</code> إن وُجِدَّت، لكنها تُضِيفها باستخدام مُعامِل الدالة المُمَرَّر لها إن لم تَكُن موجودة، كالآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_107" style="">
<span class="pln">string theValue2 </span><span class="pun">=</span><span class="pln"> dict</span><span class="pun">.</span><span class="typ">GetOrAdd</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="pun">(</span><span class="pln">key</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> key </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pln"> </span><span class="pun">?</span><span class="pln"> </span><span class="str">"Second"</span><span class="pln"> </span><span class="pun">:</span><span class="pln"> </span><span class="str">"Not Second."</span><span class="pln"> </span><span class="pun">);</span></pre>

<h3>
	تعزيز القاموس المتزامن باستخدام الإرجاء (Lazy) لخفض الحوسبة المكررة
</h3>

<p>
	المُشكِلة:
</p>

<p>
	يَبزُغ دور القاموس المُتَزَامِن <code>ConcurrentDictionary</code> عندما يكون المفتاح المطلوب مُخزنًا بالذاكرة المخبئيِّة (cache) فيُعَاد الكائن المناظر للمفتاح فوريًا عادةً بدون قِفل (lock free). لكن ماذا لو لم يكن المفتاح موجودًا بالذاكرة المخبئيِّة (cache misses) وكانت عملية تنشئة الكائن مُكلِفة بصورة تفوق كُلفة تبديل سياق الخيط (thread-context switch)؟
</p>

<p>
	في هذه الحالة، إذا طَلَبَت عدة خيوط (threads) الوُلوج إلى نفس المفتاح، سيُنشّئ كلًا منها كائنًا. وبالنهاية، سيُضاف إحداها فقط إلى التَجمِيعَة بينما ستُهمل بقية الكائنات، مما يعني هَدْر أكثر من مورد بصورة غير ضرورية سواء كان مورد وحدة المعالجة المركزية (CPU) لتنشئة تلك الكائنات أو مورد الذاكرة لتخزينها بشكل مؤقت، بالاضافة إلى هَدْر بعض الموارد الأخرى.
</p>

<p>
	الحل:
</p>

<p>
	لتجاوز تلك المشكلة، يُمكِن الجمع بين القاموس المُتَزَامِن <code>ConcurrentDictionary&lt;TKey, TValue&gt;‎</code> والتهيئة المُرجأة باستخدام الصنف <code>Lazy&lt;TValue&gt;‎</code>. الفكرة ببساطة تعتمد على كَوْن تابع القاموس المُتَزَامِن <code>GetOrAdd</code> يُعيِد فقط القيم المُضافة فعليًا للتَجمِيعَة. لاحظ أنه، في هذه الحالة أيضًا، قد تُهْدَر الكائنات المُرجأة (Lazy objects)، لكن لا يُمكن عَدَّ ذلك مشكلة كبيرة، وبخاصة أن الكائنات المُرجأة ليست مُكلِفة بالموازنة مع الكائن الفِعلِي، وبالطبع أنت ذكي كفاية لألا تَطلُب خاصية <code>Value</code> الموجودة بتلك الكائنات، وإنما يُفترض بك أن تطلبها فقط للكائنات العائدة من التابع <code>GetOrAdd</code> مما يَضمن كوْنها مُضافة فِعليًا للتَجميعة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_111" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">ConcurrentDictionaryExtensions</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">TValue</span><span class="pln"> </span><span class="typ">GetOrCreateLazy</span><span class="pun">&lt;</span><span class="typ">TKey</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TValue</span><span class="pun">&gt;(</span><span class="pln">
        </span><span class="kwd">this</span><span class="pln"> </span><span class="typ">ConcurrentDictionary</span><span class="pun">&lt;</span><span class="typ">TKey</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Lazy</span><span class="pun">&lt;</span><span class="typ">TValue</span><span class="pun">&gt;&gt;</span><span class="pln"> d</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">TKey</span><span class="pln"> key</span><span class="pun">,</span><span class="pln">
        </span><span class="typ">Func</span><span class="pun">&lt;</span><span class="typ">TKey</span><span class="pun">,</span><span class="pln"> </span><span class="typ">TValue</span><span class="pun">&gt;</span><span class="pln"> factory</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln">
            d</span><span class="pun">.</span><span class="typ">GetOrAdd</span><span class="pun">(</span><span class="pln">
            key</span><span class="pun">,</span><span class="pln">
            key1 </span><span class="pun">=&gt;</span><span class="pln">
            </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Lazy</span><span class="pun">&lt;</span><span class="typ">TValue</span><span class="pun">&gt;(()</span><span class="pln"> </span><span class="pun">=&gt;</span><span class="pln"> factory</span><span class="pun">(</span><span class="pln">key1</span><span class="pun">),</span><span class="pln">
                             </span><span class="typ">LazyThreadSafetyMode</span><span class="pun">.</span><span class="typ">ExecutionAndPublication</span><span class="pun">)).</span><span class="typ">Value</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	قد يكْون التخزين المؤقت (caching) للكائنات من الصنف <code>XmlSerializer</code> بالتحديد مُكلِفًا، مع وجود كثير من التنازع (contention) أثناء بدء تشغيل (startup) البرنامج. علاوة على ذلك، إذا كانت المُسَلسِلَات مُخصّصة (custom serializers)، ستُسَرَّب الذاكرة (memory leak) أثناء بقية دورة حياة العمليّة (process lifecycle).
</p>

<p>
	الفائدة الوحيدة من استخدام القاموس المُتزامِن <code>ConcurrentDictionary</code> في هذه الحالة هو تجنب الأقفال (locks) أثناء بقية دورة حياة العمليّة (process lifecycle)، ولكن لن يكون وقت بدء تشغيل البرنامج واستهلاك الذاكرة مقبولًا. وهنا يَبزُغ دور القاموس المتزامن المُعَّزز بالإِرجَاء المُذكور سلفًا.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_113" style="">
<span class="kwd">private</span><span class="pln"> </span><span class="typ">ConcurrentDictionary</span><span class="pun">&lt;</span><span class="typ">Type</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Lazy</span><span class="pun">&lt;</span><span class="typ">XmlSerializer</span><span class="pun">&gt;&gt;</span><span class="pln"> _serializers </span><span class="pun">=</span><span class="pln">
    </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ConcurrentDictionary</span><span class="pun">&lt;</span><span class="typ">Type</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Lazy</span><span class="pun">&lt;</span><span class="typ">XmlSerializer</span><span class="pun">&gt;&gt;();</span><span class="pln">


</span><span class="kwd">public</span><span class="pln"> </span><span class="typ">XmlSerializer</span><span class="pln"> </span><span class="typ">GetSerialier</span><span class="pun">(</span><span class="typ">Type</span><span class="pln"> t</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> _serializers</span><span class="pun">.</span><span class="typ">GetOrCreateLazy</span><span class="pun">(</span><span class="pln">t</span><span class="pun">,</span><span class="pln"> </span><span class="typ">BuildSerializer</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


</span><span class="kwd">private</span><span class="pln"> </span><span class="typ">XmlSerializer</span><span class="pln"> </span><span class="typ">BuildSerializer</span><span class="pun">(</span><span class="typ">Type</span><span class="pln"> t</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">throw</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">NotImplementedException</span><span class="pun">(</span><span class="str">"and this is a homework"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	تجمِيعات القراءة فقط <code>ReadOnlyCollections</code>
</h2>

<h3>
	تنشئة تجميعة قراءة فقط
</h3>

<ul>
<li>
		باستخدام بَانِي الكائن (Constructor)
	</li>
</ul>
<p>
	تُنشَّئ تجميعة قراءة فقط <code>ReadOnlyCollection</code> بتَمريِر كائن واجهة <code>IList</code> إلى بَانِي الكائن الخاص بالصنف <code>ReadOnlyCollection</code>، كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_115" style="">
<span class="pln">var groceryList </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="str">&lt;string&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"Apple"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Banana"</span><span class="pln"> </span><span class="pun">};</span><span class="pln">
var readOnlyGroceryList </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ReadOnlyCollection</span><span class="str">&lt;string&gt;</span><span class="pun">(</span><span class="pln">groceryList</span><span class="pun">);</span></pre>

<ul>
<li>
		باستخدام استعلامات LINQ
	</li>
</ul>
<p>
	تُوفِر استعلامات LINQ تابع مُوسِّع <code>AsReadOnly()‎</code> لكائنات وَاجِهة <code>IList</code>، كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_117" style="">
<span class="pln">var readOnlyVersion </span><span class="pun">=</span><span class="pln"> groceryList</span><span class="pun">.</span><span class="typ">AsReadOnly</span><span class="pun">();</span></pre>

<p>
	عادة ما تُريد الاحتفاظ بمَرجِع مَصْدَر التَجمِيعَة بِهَدف التعديل عليه خاصًا (private)، بينما تَسمَح بالولُوج العَلنِي (public) إلى تَجمِيعَة القراءة فقط <code>ReadOnlyCollection</code>. في حِين تستطيع تَنشِّئة نسخة القراءة فقط مِن قائمة ضِمنيّة (in-line list) كالمثال التالي، لن تكون قادرًا على تعديل التَجمِيعَة بعد إِنشَّائها.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_119" style="">
<span class="pln">var readOnlyGroceryList </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="str">&lt;string&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="str">"Apple"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Banana"</span><span class="pun">}.</span><span class="typ">AsReadOnly</span><span class="pun">();</span></pre>

<p>
	عظيم! لكنك لن تكون قادرًا على تحديث القائمة لأنك لم تعد تمتلك مرجع للقائمة اﻷصلية.
</p>

<p>
	إذا كانت التَنشِّئة من قائمة ضِمنيّة مناسبة لغَرضَك، رُبما يُفترض بك استخدام هيكل بيانات آخر مثل التَجمِيعَة الثابتة <code>ImmutableCollection</code>.
</p>

<h3>
	تحديث تجميعة قراءة فقط
</h3>

<p>
	كما ذكرنا مُسبَقًا، لا يُمكنك تعديل تَجمِيعَة القراءة فقط <code>ReadOnlyCollection</code> مباشرة. بدلًا من ذلك، يُحَدَّث مَصْدَر التَجمِيعَة الذي بِدورِه يؤدي إلى تحديث تَجمِيعَة القراءة فقط. يُعد ذلك مِيزة رئيسية لتَجمِيعَات القراءة فقط <code>ReadOnlyCollection</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_121" style="">
<span class="pln">var groceryList </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="str">&lt;string&gt;</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"Apple"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Banana"</span><span class="pln"> </span><span class="pun">};</span><span class="pln">


var readOnlyGroceryList </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ReadOnlyCollection</span><span class="str">&lt;string&gt;</span><span class="pun">(</span><span class="pln">groceryList</span><span class="pun">);</span><span class="pln">


var itemCount </span><span class="pun">=</span><span class="pln"> readOnlyGroceryList</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">;</span><span class="pln">         </span><span class="com">// تحتوي على عنصرين</span><span class="pln">


</span><span class="com">//readOnlyGroceryList.Add("Candy");                 // خطأ تصريفي، لا يُمكن إضافة عناصر لكائن من الصنف ReadOnlyCollection </span><span class="pln">


groceryList</span><span class="pun">.</span><span class="typ">Add</span><span class="pun">(</span><span class="str">"Vitamins"</span><span class="pun">);</span><span class="pln">                                 </span><span class="com">// لكن يمكن إضافتهم إلى التجميعة الأصلية</span><span class="pln">


itemCount </span><span class="pun">=</span><span class="pln"> readOnlyGroceryList</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">;</span><span class="pln">                 </span><span class="com">// الآن، تحتوي على ثلاثة عناصر</span><span class="pln">
var lastItem </span><span class="pun">=</span><span class="pln"> readOnlyGroceryList</span><span class="pun">.</span><span class="typ">Last</span><span class="pun">();</span><span class="pln">                 </span><span class="com">// أصبح العنصر اﻷخير بتجميعة القراءة فقط هو "Vitamins"</span></pre>

<p>
	<a href="https://dotnetfiddle.net/C8qQrS" rel="external nofollow">مِثال حيّ</a>
</p>

<h3>
	عناصر تجمِيعات القراءة فقط ليست بالضرورة للقراءة فقط
</h3>

<p>
	إذا كانت عناصر مَصْدَر التَجمِيعَة من نوع غَيْر ثابِت (mutable)، فعِندها يُمكن الولُوج إليها من خلال تَجمِيعَة القراءة فقط وتعديلها.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_3493_123" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Item</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> decimal </span><span class="typ">Price</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">FillOrder</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// An order is generated</span><span class="pln">
    var order </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">List</span><span class="pun">&lt;</span><span class="typ">Item</span><span class="pun">&gt;</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Item</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Apple"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Price</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.50m</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
        </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Item</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Banana"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Price</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.75m</span><span class="pln"> </span><span class="pun">},</span><span class="pln">
        </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Item</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Vitamins"</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Price</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5.50m</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">};</span><span class="pln">


    </span><span class="com">// The current sub total is $6.75</span><span class="pln">
    var subTotal </span><span class="pun">=</span><span class="pln"> order</span><span class="pun">.</span><span class="typ">Sum</span><span class="pun">(</span><span class="pln">item </span><span class="pun">=&gt;</span><span class="pln"> item</span><span class="pun">.</span><span class="typ">Price</span><span class="pun">);</span><span class="pln">


    </span><span class="com">// Let the customer preview their order</span><span class="pln">
    var customerPreview </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">ReadOnlyCollection</span><span class="pun">&lt;</span><span class="typ">Item</span><span class="pun">&gt;(</span><span class="pln">order</span><span class="pun">);</span><span class="pln">


    </span><span class="com">// لا يمكن إضافة أو حذف عناصر من تجميعة القراءة فقط لكن يمكن التعديل على قيمة متغير السعر</span><span class="pln">
    customerPreview</span><span class="pun">.</span><span class="typ">Last</span><span class="pun">().</span><span class="typ">Price</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.25m</span><span class="pun">;</span><span class="pln">


    </span><span class="com">// The sub total is now only $1.50!</span><span class="pln">
    subTotal </span><span class="pun">=</span><span class="pln"> order</span><span class="pun">.</span><span class="typ">Sum</span><span class="pun">(</span><span class="pln">item </span><span class="pun">=&gt;</span><span class="pln"> item</span><span class="pun">.</span><span class="typ">Price</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	<a href="https://dotnetfiddle.net/fXE66F" rel="external nofollow">مِثال حيّ</a>
</p>

<p>
	ترجمة -وبتصرف- للفصول:
</p>

<ul>
<li>
		Dictionaries
	</li>
	<li>
		Collections
	</li>
	<li>
		ReadOnlyCollections
	</li>
</ul>
<p>
	من كتاب <a href="https://goalkicker.com/DotNETFrameworkBook/" rel="external nofollow">‎.NET Framework Notes for Professionals</a>
</p>
]]></description><guid isPermaLink="false">947</guid><pubDate>Tue, 28 Jul 2020 13:19:43 +0000</pubDate></item><item><title>&#x627;&#x644;&#x639;&#x645;&#x644;&#x64A;&#x627;&#x62A; &#x639;&#x644;&#x649; &#x627;&#x644;&#x633;&#x644;&#x627;&#x633;&#x644; &#x627;&#x644;&#x646;&#x635;&#x64A;&#x629; Strings &#x641;&#x64A; dot NET</title><link>https://academy.hsoub.com/programming/c-sharp/dotnet/%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D8%B9%D9%84%D9%89-%D8%A7%D9%84%D8%B3%D9%84%D8%A7%D8%B3%D9%84-%D8%A7%D9%84%D9%86%D8%B5%D9%8A%D8%A9-strings-%D9%81%D9%8A-dot-net-r945/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_07/3.png.aafb155466e6523241568cbf44adec8c.png" /></p>

<h2>
	عدم قابلية السلاسل النصية للتغيير
</h2>

<p>
	تُعدّ السلاسل النصية غير قابلة للتغيير immutable؛ بمعنى أنه لا يمكن التلاعب بسلسلة نصية بتغيير أحد المحارف فيها. عند إجراء أي عملية على السلسلة النصية، يُنشَئ نسخة جديدة منها بعد التعديل؛ مما يعني أنه عند استبدال حرف واحد بـسلسة نصية طويلة، ستُعيَّن مساحة بالذاكرة للقيمة الجديدة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_7" style="">
<span class="com">// تعيين مساحة بالذاكرة</span><span class="pln">
string veryLongString </span><span class="pun">=</span><span class="pln"> </span><span class="pun">...</span><span class="pln">
</span><span class="com">// حذف أول حرف من السلسلة النصية</span><span class="pln">
string newString </span><span class="pun">=</span><span class="pln"> veryLongString</span><span class="pun">.</span><span class="typ">Remove</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="lit">1</span><span class="pun">);</span><span class="pln"> </span></pre>

<p>
	إذا أردت إجراء عدد كبير من العمليات على قيمة سلسلة نصية، استخدم الصنف <code>StringBuilder</code> المُعدّ خصيصًا للتعديل على السلاسل النصية بكفاءة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_9" style="">
<span class="pln">var sb </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">StringBuilder</span><span class="pun">(</span><span class="pln">someInitialString</span><span class="pun">);</span><span class="pln">
foreach</span><span class="pun">(</span><span class="pln">var str in manyManyStrings</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    sb</span><span class="pun">.</span><span class="typ">Append</span><span class="pun">(</span><span class="pln">str</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
var finalString </span><span class="pun">=</span><span class="pln"> sb</span><span class="pun">.</span><span class="typ">ToString</span><span class="pun">();</span></pre>

<h2>
	عد الحروف
</h2>

<p>
	إذا كنت بحاجة إلى عَدّ الحروف بسلسلة نصية، فلا يُمكِنك ببساطة استخدام الخاصية <code>Length</code>؛ لأنها تَحسِب عدد العناصر بمصفوفة محارف. لا تُمثِّل هذه المصفوفة الحروف كما نعهدها، وإنما تُمثِّل العدد البتي للمحرف code-unit (ليس محارف اليونيكود Unicode code-points ولا الوحدات الكتابية graphemes). لذلك فإن الشيفرة الصحيحة تكون كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_11" style="">
<span class="typ">int</span><span class="pln"> length </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">EnumerateCharacters</span><span class="pun">().</span><span class="typ">Count</span><span class="pun">();</span></pre>

<p>
	يُمكِن لتحسين بسيط إعادة كتابة التابع المُوسِّع <code>EnumerateCharacters</code>؛ بحيث يكون مُعَدّ خصيصًا لحِساب عدد المحارف:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_13" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">StringExtensions</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">CountCharacters</span><span class="pun">(</span><span class="kwd">this</span><span class="pln"> string text</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">String</span><span class="pun">.</span><span class="typ">IsNullOrEmpty</span><span class="pun">(</span><span class="pln">text</span><span class="pun">))</span><span class="pln">
            </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
        </span><span class="typ">int</span><span class="pln"> count </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
        var enumerator </span><span class="pun">=</span><span class="pln"> </span><span class="typ">StringInfo</span><span class="pun">.</span><span class="typ">GetTextElementEnumerator</span><span class="pun">(</span><span class="pln">text</span><span class="pun">);</span><span class="pln">
        </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">enumerator</span><span class="pun">.</span><span class="typ">MoveNext</span><span class="pun">())</span><span class="pln">
            </span><span class="pun">++</span><span class="pln">count</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> count</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	عد الحروف غير المكررة
</h2>

<p>
	على سبيل المثال، إذا استخدمت <code>text.Distinct().Count()‎‎</code>، سَتحصُل على نتائج خاطئة. الشيفرة الصحيحة كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_15" style="">
<span class="typ">int</span><span class="pln"> distinctCharactersCount </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">EnumerateCharacters</span><span class="pun">().</span><span class="typ">Count</span><span class="pun">();</span></pre>

<p>
	خطوة إضافية هي عَدّ مرات تكرار كل حرف على حدى. يُمكِنك ببساطة استخدام الشيفرة التالية إذا لم يكن عامل اﻷداء مهمًا:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_17" style="">
<span class="pln">var frequencies </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">EnumerateCharacters</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">.</span><span class="typ">GroupBy</span><span class="pun">(</span><span class="pln">x </span><span class="pun">=&gt;</span><span class="pln"> x</span><span class="pun">,</span><span class="pln"> </span><span class="typ">StringComparer</span><span class="pun">.</span><span class="typ">CurrentCultureIgnoreCase</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">.</span><span class="typ">Select</span><span class="pun">(</span><span class="pln">x </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="typ">Character</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> x</span><span class="pun">.</span><span class="typ">Key</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Count</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> x</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">()</span><span class="pln"> </span><span class="pun">};</span></pre>

<h2>
	تحويل السلسلة النصية من وإلى ترميز آخر
</h2>

<p>
	السلاسل النصية بالـ ‎.NET هي بالأساس مصفوفة محارف <code>System.Char</code> (عبارة عن بتات الترميز <code>UTF-16</code>). إذا أردت حفظ النصوص أو التعامل معها بترميز آخر، يجب أن تتعامل مع مصفوفة بايتات <code>System.Byte</code>.
</p>

<p>
	تُحَوِّل أصناف مُشتَقَة من <code>System.Text.Encoder</code> و <code>System.Text.Decoder</code> النصوص من وإلى ترميز آخر (من مصفوفة بايتات إلى سلسلة نصية بترميز <code>UTF-16</code> والعكس).
</p>

<p>
	من المُعتاد أن تُستَدعَى كلًا من أداة الترميز وفكه سويًا، لذلك تُتضَمَن داخل أصناف مُشتَقَة من <code>System.Text.Encoding</code>؛ بحيث تُحوِّل هذه الأصناف من وإلى الترميزات الشائعة (<code>UTF-8</code> و <code>UTF-16</code> ..إلخ)
</p>

<h3>
	أمثلة
</h3>

<p>
	تحويل سلسلة نصية إلى ترميز UTF-8:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_19" style="">
<span class="pln">byte</span><span class="pun">[]</span><span class="pln"> data </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Encoding</span><span class="pun">.</span><span class="pln">UTF8</span><span class="pun">.</span><span class="typ">GetBytes</span><span class="pun">(</span><span class="str">"This is my text"</span><span class="pun">);</span></pre>

<p>
	تحويل بيانات بترميز UTF-8 إلى سلسلة نصية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_21" style="">
<span class="pln">var text </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Encoding</span><span class="pun">.</span><span class="pln">UTF8</span><span class="pun">.</span><span class="typ">GetString</span><span class="pun">(</span><span class="pln">data</span><span class="pun">);</span></pre>

<p>
	تغيير ترميز ملف نصي:
</p>

<p>
	تقرأ الشيفرة التالية محتويات ملف نصي بترميز <code>UTF-8</code>، ثم تحفظها مجددًا، ولكن بترميز <code>UTF-16</code>. إذا كان حجم الملف كبيرًا، فإن هذه الشيفرة ليست الحل الأمثل؛ لأنها ستنقل جميع محتويات الملف إلى الذاكرة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_23" style="">
<span class="pln">var content </span><span class="pun">=</span><span class="pln"> </span><span class="typ">File</span><span class="pun">.</span><span class="typ">ReadAllText</span><span class="pun">(</span><span class="pln">path</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Encoding</span><span class="pun">.</span><span class="pln">UTF8</span><span class="pun">);</span><span class="pln">
</span><span class="typ">File</span><span class="pun">.</span><span class="typ">WriteAllText</span><span class="pun">(</span><span class="pln">content</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Encoding</span><span class="pun">.</span><span class="pln">UTF16</span><span class="pun">);</span></pre>

<h2>
	موازنة السلاسل النصية
</h2>

<p>
	بالرغم من أن النوع String نوع مَرجِعِي باﻷساس، يُقارِن عامل المساواة <code>==</code> قيمة السلسلة النصية وليس مَرجِعها.
</p>

<p>
	ربما تعلم أن السلسلة النصية ليست سوى مصفوفة محارف. لكن في المقابل، إن كنت تظن أن اختبار مساواة السلاسل النصية ومقارنتها النسبية يتم على مستوى المحارف حرفًا بحرف، فأنت على خطأ. في الواقع، تختلف عمليات الاختبار بحسب اللغة؛ فمن الممكن أن تتكافئ أكثر من متتالية محارف اعتمادا على اللغة.
</p>

<p>
	عند اختبار مساواة سلسلتين نصيتين، فكر مليًا قبل الاعتماد على تساوي خاصية الطول <code>Length</code> للسلسلتين بِحُسبَانِها <strong>دارة قصيرة</strong> short circuiting.
</p>

<p>
	تُستخدم الدارة القصيرة مع التعبيرات المنطقية logical expressions لاختصار حِساب قيمة التعبير إن كان ذلك مُمكنًا. فمثلًا، تُعيد العملية AND القيمة true فقط إذا آل كِلا مُعامليها للقيمة true. وبالتالي، إذا آل المعامل اﻷول للقيمة false، يُمكِن للدارة القصيرة أن تُعيد القيمة false كقيمة إجمالية للتعبير المنطقي دون الحاجة إلى حساب قيمة المعامل الثاني؛ ﻷن قيمته لم تعد مُؤثرة.
</p>

<p>
	إذا أردت تغيير السلوك الافتراضي لعملية الموازنة، يُمكِنك استخدام التحميلات الزائدة (method overloading) للتابع <code>String.Equal</code>، والتي تَستَقبِل مُعامِلًا إضافيًا من النوع <code>StringComparison</code>.
</p>

<h2>
	عد مرات تكرار حرف معين
</h2>

<p>
	لا يُمكِنك ببساطة استخدام الشيفرة التالية لحساب عدد مرات تكرار حرف معين (إلا إذا كنت ترغب بعَدّ مرات تكرار العدد البتي للمحرف):
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_25" style="">
<span class="typ">int</span><span class="pln"> count </span><span class="pun">=</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">Count</span><span class="pun">(</span><span class="pln">x </span><span class="pun">=&gt;</span><span class="pln"> x </span><span class="pun">==</span><span class="pln"> ch</span><span class="pun">);</span></pre>

<p>
	في الواقع، تحتاج لدالة أكثر تعقيدًا مثل الدالة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_27" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">CountOccurrencesOf</span><span class="pun">(</span><span class="kwd">this</span><span class="pln"> string text</span><span class="pun">,</span><span class="pln"> string character</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> text</span><span class="pun">.</span><span class="typ">EnumerateCharacters</span><span class="pun">()</span><span class="pln">
        </span><span class="pun">.</span><span class="typ">Count</span><span class="pun">(</span><span class="pln">x </span><span class="pun">=&gt;</span><span class="pln"> </span><span class="typ">String</span><span class="pun">.</span><span class="typ">Equals</span><span class="pun">(</span><span class="pln">x</span><span class="pun">,</span><span class="pln"> character</span><span class="pun">,</span><span class="pln"> </span><span class="typ">StringComparer</span><span class="pun">.</span><span class="typ">CurrentCulture</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أنه من الضروري أن تُقارَنّ السلاسل النصية وفقًا لقواعد لغة بعينها، بعكس مقارنة الحروف والتي يمكن أن تتباين بحسب اللغة.
</p>

<h2>
	تقسيم السلسلة النصية إلى كتل متساوية
</h2>

<p>
	لا يُمكِنك تقسيم السلسلة النصية تَقسِيمًا عشوائيًا؛ لأن أي محرف <code>System.Char</code> بداخل المصفوفة قد يكون غير صالح بمفرده؛ إِمَّا لكونه محرف دمج أو جزء من زوج بدل surrogate pair. لذلك لابد للشيفرة أن تأخذ هذا بالحسبان.
</p>

<p>
	لاحظ أن المقصود من كتل متساوية هو تساوي عدد الوحدات الكتابية graphemes وليس عدد البتات للمحرف code-units.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_29" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">IEnumerable</span><span class="str">&lt;string&gt;</span><span class="pln"> </span><span class="typ">Split</span><span class="pun">(</span><span class="kwd">this</span><span class="pln"> string value</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> desiredLength</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    var characters </span><span class="pun">=</span><span class="pln"> </span><span class="typ">StringInfo</span><span class="pun">.</span><span class="typ">GetTextElementEnumerator</span><span class="pun">(</span><span class="pln">value</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">characters</span><span class="pun">.</span><span class="typ">MoveNext</span><span class="pun">())</span><span class="pln">
        yield </span><span class="kwd">return</span><span class="pln"> </span><span class="typ">String</span><span class="pun">.</span><span class="typ">Concat</span><span class="pun">(</span><span class="typ">Take</span><span class="pun">(</span><span class="pln">characters</span><span class="pun">,</span><span class="pln"> desiredLength</span><span class="pun">));</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">private</span><span class="pln"> </span><span class="kwd">static</span><span class="pln"> </span><span class="typ">IEnumerable</span><span class="str">&lt;string&gt;</span><span class="pln"> </span><span class="typ">Take</span><span class="pun">(</span><span class="typ">TextElementEnumerator</span><span class="pln"> enumerator</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> count</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> count</span><span class="pun">;</span><span class="pln"> </span><span class="pun">++</span><span class="pln">i</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        yield </span><span class="kwd">return</span><span class="pln"> </span><span class="pun">(</span><span class="pln">string</span><span class="pun">)</span><span class="pln">enumerator</span><span class="pun">.</span><span class="typ">Current</span><span class="pun">;</span><span class="pln">
        </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">enumerator</span><span class="pun">.</span><span class="typ">MoveNext</span><span class="pun">())</span><span class="pln">
            yield </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	التابع الإفتراضي <code>Object.ToString</code>
</h2>

<p>
	كل الأنواع الموجودة في NET. هي أنواع مشتقة من النوع Object في نهاية المطاف الذي يحوي التابع ToString، لذا ترثه تلك الأنواع المشتقة تلقائيًا ويمكن إعادة كتابة تنفيذ خاص به لنوع محدَّد والخروج عن التنفيذ الافتراضي الذي يعيد اسم النوع افتراضيًا إن لم يكن هنالك ما يحوّله.
</p>

<p>
	المثال التالي يُعرف الصنف Foo، ونظرًا ﻷنه لم يُعيد كتابة تنفيذ التابع <code>ToString</code>، تم استدعاء التنفيذ الافتراضي فيكون الخْرج هو اسم الصنف Foo:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_31" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln">
</span><span class="pun">{</span><span class="pln">    
</span><span class="pun">}</span><span class="pln">


var foo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Foo</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">foo</span><span class="pun">);</span><span class="pln"> </span><span class="com">// outputs Foo</span></pre>

<p>
	يُستَدعَى التابع <code>ToString</code> ضمنيًا عند ضم قيمة إلى سلسلة نصية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_33" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Foo</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> override string </span><span class="typ">ToString</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="kwd">return</span><span class="pln"> </span><span class="str">"I am Foo"</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
var foo </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">Foo</span><span class="pun">();</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"I am bar and "</span><span class="pun">+</span><span class="pln">foo</span><span class="pun">);</span><span class="pln"> </span><span class="com">// I am bar and I am Foo</span></pre>

<p>
	تُسجِل أدوات تنقيح الأخطاء debugging tools الأحَدَاث الحاصلة في البرنامج logs، لذلك فإنها عادة ما تحتاج للإشارة إلى الكائنات المُتفاعلة ضمن الحَدَث. لذا تلجأ لاستخدام التابع <code>ToString</code>. إذا أردت، لسبب ما، أن تُخصِّص طريقة عرض المُنقح debugger للقيم بدون أن تُعيد تعريف التابع، استخدم السمة <code>DebuggerDisplay</code>، انظر <a href="https://msdn.microsoft.com/en-us/library/system.diagnostics.debuggerdisplayattribute(v=vs.110).aspx" rel="external nofollow">MSDN</a>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_35" style="">
<span class="com">// [DebuggerDisplay("Person = FN {FirstName}, LN {LastName}")]</span><span class="pln">
</span><span class="pun">[</span><span class="typ">DebuggerDisplay</span><span class="pun">(</span><span class="str">"Person = FN {"</span><span class="pun">+</span><span class="pln">nameof</span><span class="pun">(</span><span class="typ">Person</span><span class="pun">.</span><span class="typ">FirstName</span><span class="pun">)+</span><span class="str">"}, LN {"</span><span class="pun">+</span><span class="pln">nameof</span><span class="pun">(</span><span class="typ">Person</span><span class="pun">.</span><span class="typ">LastName</span><span class="pun">)+</span><span class="str">"}"</span><span class="pun">)]</span><span class="pln">
</span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Person</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">FirstName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;</span><span class="pln"> </span><span class="pun">}</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln"> string </span><span class="typ">LastName</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> get</span><span class="pun">;</span><span class="pln"> </span><span class="typ">set</span><span class="pun">;}</span><span class="pln">
    </span><span class="com">// ...</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	التعبيرات النمطية (Regular Expressions)
</h2>

<h3>
	التابع <code>Regex.IsMatch</code> لاختبار تطابق نمط (pattern)
</h3>

<p>
	يَفحص التابع <code>Regex.IsMatch</code> ما إذا كانت السِلسِلة النصية المُعطاة متطابقة مع نَمط معين، ويُعيد قيمة منطقية تُحدِّد ذلك، كالمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_37" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">bool</span><span class="pln"> </span><span class="typ">Check</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    string input </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello World!"</span><span class="pun">;</span><span class="pln">
    string pattern </span><span class="pun">=</span><span class="pln"> </span><span class="pun">@</span><span class="str">"H.ll. W.rld!"</span><span class="pun">;</span><span class="pln">

    </span><span class="com">// true</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Regex</span><span class="pun">.</span><span class="typ">IsMatch</span><span class="pun">(</span><span class="pln">input</span><span class="pun">,</span><span class="pln"> pattern</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تَتوفَّر بَصمة أُخْرى من التابع <code>Regex.IsMatch</code> تَسمَح بتمرير بعض الخيارات للتحكم بعملية الفحص، كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_39" style="">
<span class="kwd">public</span><span class="pln"> </span><span class="kwd">bool</span><span class="pln"> </span><span class="typ">Check</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    string input </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello World!"</span><span class="pun">;</span><span class="pln">
    string pattern </span><span class="pun">=</span><span class="pln"> </span><span class="pun">@</span><span class="str">"H.ll. W.rld!"</span><span class="pun">;</span><span class="pln">

    </span><span class="com">// true</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Regex</span><span class="pun">.</span><span class="typ">IsMatch</span><span class="pun">(</span><span class="pln">input</span><span class="pun">,</span><span class="pln"> pattern</span><span class="pun">,</span><span class="pln"> </span><span class="typ">RegexOptions</span><span class="pun">.</span><span class="typ">IgnoreCase</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">RegexOptions</span><span class="pun">.</span><span class="typ">Singleline</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	التابع <code>Regex.Match</code> لاستخراج أول تطابق (match)
</h3>

<p>
	يبحث التابع <code>Regex.Match</code> عن نمط (pattern) معين بالسِلسِلة النمطية المُعطاة، ويُعيد كائن من النوع <code>Match</code> يُمثِل أول ظهور (occurrence) للنمط بالسِلسِلة.
</p>

<p>
	يُمكِن الولوج للخاصيتين <code>Value</code> و <code>Index</code> بالقيمة المُعادة. تَحوي الأولى القيمة الكاملة لأول ظهور للنمط بينما تَحوي الثانية مَوضِع (position) ذلك الظهور أي أين ظهرت القيمة المتطابقة.
</p>

<p>
	تَستطيع أيضًا الولوج للخاصية <code>Groups</code> من النوع <code>GroupCollection</code>. تَحمِل هذه الخاصية دومًا عنصر واحد على الأقل، سيحتوي هذا العنصر على القيمة الكاملة لأول ظهور للنمط إن وجد أو قيمة فارغة في حالة عدم وجوده. قد تتواجد عناصر اخرى ضِمْن التَجمِيعَة إذا كنت قد عَرَّفت أي مجموعات بالنمط المُمرَّر مثل <code>Subject</code> كالمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_41" style="">
<span class="pln">string input </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello World!"</span><span class="pun">;</span><span class="pln">
string pattern </span><span class="pun">=</span><span class="pln"> </span><span class="pun">@</span><span class="str">"H.ll. (?&lt;Subject&gt;W.rld)!"</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Match</span><span class="pln"> match </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Regex</span><span class="pun">.</span><span class="typ">Match</span><span class="pun">(</span><span class="pln">input</span><span class="pun">,</span><span class="pln"> pattern</span><span class="pun">);</span><span class="pln">

</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">match</span><span class="pun">.</span><span class="typ">Value</span><span class="pun">);</span><span class="pln">                        </span><span class="com">// Hello World!</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">match</span><span class="pun">.</span><span class="typ">Index</span><span class="pun">);</span><span class="pln">                        </span><span class="com">// 0</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">match</span><span class="pun">.</span><span class="typ">Groups</span><span class="pun">[</span><span class="str">"Subject"</span><span class="pun">].</span><span class="typ">Value</span><span class="pun">);</span><span class="pln">     </span><span class="com">// World</span></pre>

<h3>
	التابع <code>Regex.Matches</code> لاستخراج جميع التطابقات (matches)
</h3>

<p>
	يَعمَل بصورة مشابهة للتابع <code>Regex.Match</code> لكنه لا يَقتصِر على إعادة أول ظهور (occurrence) للنمط بالسِلسِلة النصية، وإنما يُعيد قيمة من النوع <code>GroupCollection</code> تحتوي على جميع التطابقات (matches). انظر المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_43" style="">
<span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">.</span><span class="typ">Text</span><span class="pun">.</span><span class="typ">RegularExpressions</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">string</span><span class="pun">[]</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    string input </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Carrot Banana Apple Cherry Clementine Grape"</span><span class="pun">;</span><span class="pln">
    </span><span class="com">// Find words that start with uppercase 'C'</span><span class="pln">
    string pattern </span><span class="pun">=</span><span class="pln"> </span><span class="pun">@</span><span class="str">"\bC\w*\b"</span><span class="pun">;</span><span class="pln">
    </span><span class="typ">MatchCollection</span><span class="pln"> matches </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Regex</span><span class="pun">.</span><span class="typ">Matches</span><span class="pun">(</span><span class="pln">input</span><span class="pun">,</span><span class="pln"> pattern</span><span class="pun">);</span><span class="pln">

    foreach </span><span class="pun">(</span><span class="typ">Match</span><span class="pln"> m in matches</span><span class="pun">)</span><span class="pln">
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">m</span><span class="pun">.</span><span class="typ">Value</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	الخْرج:
</p>

<pre class="ipsCode">
Carrot
Cherry
Clementine
</pre>

<h3>
	التابع <code>Regex.Replace</code> للاستبدال وفقًا لنمط
</h3>

<p>
	يَستبدِل التابع <code>Regex.Replace</code> أجزاء من سِلسِلة نصية مُعطاة وفقًا لنمط يُمرَّر إليه، ثم يُعيد السِلسِلة النصية بعد عملية الاستبدال، كالمثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_45" style="">
<span class="kwd">public</span><span class="pln"> string </span><span class="typ">Check</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    string input </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello World!"</span><span class="pun">;</span><span class="pln">
    string pattern </span><span class="pun">=</span><span class="pln"> </span><span class="pun">@</span><span class="str">"W.rld"</span><span class="pun">;</span><span class="pln">

    </span><span class="com">// Hello Stack Overflow!</span><span class="pln">
    </span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Regex</span><span class="pun">.</span><span class="typ">Replace</span><span class="pun">(</span><span class="pln">input</span><span class="pun">,</span><span class="pln"> pattern</span><span class="pun">,</span><span class="pln"> </span><span class="str">"Stack Overflow"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يُمكن استخدام التابع <code>Regex.Replace</code> لحَذْف الحروف الأبْجَعَددية (alphanumeric) من سِلسِلة نصية عن طريق تمرير النمط <code>[^a-zA-Z0-9]</code> للتابع وطلب استبداله بسِلسِلة نصية فارغة، كالتالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6540_47" style="">
<span class="kwd">public</span><span class="pln"> string </span><span class="typ">Remove</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    string input </span><span class="pun">=</span><span class="pln"> </span><span class="str">"Hello./!"</span><span class="pun">;</span><span class="pln">

    </span><span class="kwd">return</span><span class="pln"> </span><span class="typ">Regex</span><span class="pun">.</span><span class="typ">Replace</span><span class="pun">(</span><span class="pln">input</span><span class="pun">,</span><span class="pln"> </span><span class="str">"[^a-zA-Z0-9]"</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ترجمة -وبتصرف- للفصل DateTime parsing من كتاب <a href="https://goalkicker.com/DotNETFrameworkBook/" rel="external nofollow">‎.NET Framework Notes for Professionals</a>
</p>
]]></description><guid isPermaLink="false">945</guid><pubDate>Wed, 29 Jul 2020 13:35:51 +0000</pubDate></item><item><title>&#x62A;&#x62D;&#x644;&#x64A;&#x644; &#x627;&#x644;&#x62A;&#x627;&#x631;&#x64A;&#x62E; &#x648;&#x627;&#x644;&#x648;&#x642;&#x62A; &#x641;&#x64A; dot NET</title><link>https://academy.hsoub.com/programming/c-sharp/dotnet/%D8%AA%D8%AD%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%AA%D8%A7%D8%B1%D9%8A%D8%AE-%D9%88%D8%A7%D9%84%D9%88%D9%82%D8%AA-%D9%81%D9%8A-dot-net-r944/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_07/2.png.11d9a005f0de3587a9a23988a4d7fb55.png" /></p>

<h2>
	التابع <code>ParseExact</code>
</h2>

<p>
	يَستقبِل التابع <code>DateTime.ParseExact</code> مُعامِلًا ثالثًا، والذي يُحدِّد مَحلّيّة (Culture/Locale) صِيْغة سلسلة التنسيق (Format String)، مما يُمكِنك من تمرير قيمة مَحلّيّة مُحدّدة. يُؤدي تمرير القيمة الفارغة (null) أو القيمة <code>CultureInfo.CurrentCulture</code> إلى استخدام مَحلّيّة النظام.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_6" style="">
<span class="pln">var dateString </span><span class="pun">=</span><span class="pln"> </span><span class="str">"2015-11-24"</span><span class="pun">;</span><span class="pln">


var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="pln">dateString</span><span class="pun">,</span><span class="pln"> </span><span class="str">"yyyy-MM-dd"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">date</span><span class="pun">);</span></pre>

<pre class="ipsCode">
11/24/2015 12:00:00 AM
</pre>

<h3>
	صِيْغ سلسلة التنسيق (Format Strings)
</h3>

<p>
	لابّد أن تَتَّلائَم السلسلة النصية المُعطاة مع صِيْغة سلسلة التنسيق (Format String).
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_8" style="">
<span class="pln">var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"24|201511"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"dd|yyyyMM"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">date</span><span class="pun">);</span></pre>

<pre class="ipsCode">
11/24/2015 12:00:00 AM
</pre>

<p>
	إذا احتوت صِيْغة سلسلة التنسيق (Format String) على أيّة حروف غير مُحدِّدة للتنسيق (Format Specifiers)، فإنها تُعامَل كـسلسلة نصية مُجردَّة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_11" style="">
<span class="pln">var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"2015|11|24"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"yyyy|MM|dd"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">date</span><span class="pun">);</span></pre>

<pre class="ipsCode">
11/24/2015 12:00:00 AM
</pre>

<p>
	يُفرّق مُحدِّد التنسيق (Format Specifiers) بين حالات الحرف (Case). فمثلًا، في المثال التالي، حُلّلت قيم كلًا من الشهر والدقيقة إلى مَقاصِد خاطئة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_13" style="">
<span class="pln">var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"2015-01-24 11:11:30"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"yyyy-mm-dd hh:MM:ss"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">date</span><span class="pun">);</span></pre>

<pre class="ipsCode">
11/24/2015 11:01:30 AM
</pre>

<p>
	لابّد لصِيْغ سلسلة التنسيق (Format Strings) المُكونّة من حرف وحيد أن تكون قِياسية.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_15" style="">
<span class="pln">var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"11/24/2015"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"d"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CultureInfo</span><span class="pun">(</span><span class="str">"en-US"</span><span class="pun">));</span><span class="pln">
var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"2015-11-24T10:15:45"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"s"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">
var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"2015-11-24 10:15:45Z"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"u"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span></pre>

<h3>
	الاعتراضات (Exceptions)
</h3>

<p>
	يُبَلَّغ عن اعتراض من النوع <code>ArgumentNullException</code> عند تمرير قيمة فارغة (null).
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_17" style="">
<span class="pln">var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="pln">null</span><span class="pun">,</span><span class="pln"> </span><span class="str">"yyyy-MM-dd"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">
var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"2015-11-24"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span></pre>

<p>
	يُبَلَّغ عن اعتراض من النوع <code>FormatException</code>، إمِا لِكَوْن صِيغة سلسلة التنسيق غير صالحة، أو لعدم تَلاؤمها مع السلسلة النصية المُعطاة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_19" style="">
<span class="pln">var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">""</span><span class="pun">,</span><span class="pln"> </span><span class="str">"yyyy-MM-dd"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">
var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"2015-11-24"</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">
var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"2015-0C-24"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"yyyy-MM-dd"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">
var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"2015-11-24"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"yyyy-QQ-dd"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">


</span><span class="com">// Single-character format strings must be one of the standard formats</span><span class="pln">
var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"2015-11-24"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"q"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span><span class="pln">


</span><span class="com">// Format strings must match the input exactly* (see next section)</span><span class="pln">
var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"2015-11-24"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"d"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Expects 11/24/2015 or 24/11/2015 for most cultures</span></pre>

<h3>
	معالجة أكثر من صيغة سلسلة تنسيق محتملة
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_21" style="">
<span class="pln">var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="str">"2015-11-24T10:15:45"</span><span class="pun">,</span><span class="pln">
</span><span class="kwd">new</span><span class="pln"> </span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"s"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"t"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"u"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"yyyy-MM-dd"</span><span class="pln"> </span><span class="pun">},</span><span class="pln"> </span><span class="com">// Will succeed as long as input matches one of these</span><span class="pln">
</span><span class="typ">CultureInfo</span><span class="pun">.</span><span class="typ">CurrentCulture</span><span class="pun">,</span><span class="pln"> </span><span class="typ">DateTimeStyles</span><span class="pun">.</span><span class="typ">None</span><span class="pun">);</span></pre>

<h3>
	معالجة الاختلافات المحلية لصيغ سلسلة التنسيق
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_23" style="">
<span class="pln">var dateString </span><span class="pun">=</span><span class="pln"> </span><span class="str">"10/11/2015"</span><span class="pun">;</span><span class="pln">
var date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="pln">dateString</span><span class="pun">,</span><span class="pln"> </span><span class="str">"d"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CultureInfo</span><span class="pun">(</span><span class="str">"en-US"</span><span class="pun">));</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Day: {0}; Month: {1}"</span><span class="pun">,</span><span class="pln"> date</span><span class="pun">.</span><span class="typ">Day</span><span class="pun">,</span><span class="pln"> date</span><span class="pun">.</span><span class="typ">Month</span><span class="pun">);</span></pre>

<pre class="ipsCode">
Day: 11; Month: 10
</pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_25" style="">
<span class="pln">date </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">ParseExact</span><span class="pun">(</span><span class="pln">dateString</span><span class="pun">,</span><span class="pln"> </span><span class="str">"d"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CultureInfo</span><span class="pun">(</span><span class="str">"en-GB"</span><span class="pun">));</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Day: {0}; Month: {1}"</span><span class="pun">,</span><span class="pln"> date</span><span class="pun">.</span><span class="typ">Day</span><span class="pun">,</span><span class="pln"> date</span><span class="pun">.</span><span class="typ">Month</span><span class="pun">);</span></pre>

<pre class="ipsCode">
Day: 10; Month: 11
</pre>

<h2>
	التابع <code>TryParse</code>
</h2>

<p>
	تَستَقبِل البصمة <code>TryParse(string, out DateTime)‎</code> كلًا من السلسلة النصية المراد تحليلها كمُعامِل دخْل، بالإضافة إلى مُتغير آخر كمُعامِل خْرج. يُحِاول التابع تحليل السلسلة النصية المُعطاة إلى النوع <code>DateTime</code>، ثم يُعيد قيمة منطقية <code>Boolean</code> تُحدِّد إذا ما نجح أم لا.
</p>

<p>
	تُسند نتيجة التحليل إلى مُتغير الخْرج إذا ما نجحت العملية، بينما تُسنَد القيمة الافتراضية <code>DateTime.MinValue</code> للمُتغير في حالة الفشل.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_27" style="">
<span class="typ">DateTime</span><span class="pln"> parsedValue</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">TryParse</span><span class="pun">(</span><span class="str">"monkey"</span><span class="pun">,</span><span class="pln"> out parsedValue</span><span class="pun">))</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Apparently, 'monkey' is a date/time value. Who knew?"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	في المثال التالي، يُحاول التابع تَحليل السلسلة النصية المُعطاة وفقًا لكُلًا من صِيْغ التنسيق (Formats) الشائعة مِثْل <code>ISO 8601</code>، وإعدادات مَحلّيّة النظام.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_29" style="">
<span class="typ">DateTime</span><span class="pun">.</span><span class="typ">TryParse</span><span class="pun">(</span><span class="str">"11/24/2015 14:28:42"</span><span class="pun">,</span><span class="pln"> out parsedValue</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
</span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">TryParse</span><span class="pun">(</span><span class="str">"2015-11-24 14:28:42"</span><span class="pun">,</span><span class="pln"> out parsedValue</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
</span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">TryParse</span><span class="pun">(</span><span class="str">"2015-11-24T14:28:42"</span><span class="pun">,</span><span class="pln"> out parsedValue</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span><span class="pln">
</span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">TryParse</span><span class="pun">(</span><span class="str">"Sat, 24 Nov 2015 14:28:42"</span><span class="pun">,</span><span class="pln"> out parsedValue</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span></pre>

<p>
	لمّا كان هذا التابع لا يَستقبِل قيمة تُحدِّد مَحلّيّة (Culture/Locale) صيْغة التنسيق (Format)، لذا فإنه يَعتمِد على إعدادات مَحلّيّة النظام، مما قد يُؤدي إلى نتائج غير متوقعة.
</p>

<p>
	في الأمثلة التالية، لاحظ كيف تُؤثِر مَحلّيّة النظام على قيمة الخُرج.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_31" style="">
<span class="com">// System set to en-US culture</span><span class="pln">
</span><span class="kwd">bool</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">TryParse</span><span class="pun">(</span><span class="str">"24/11/2015"</span><span class="pun">,</span><span class="pln"> out parsedValue</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">result</span><span class="pun">);</span></pre>

<pre class="ipsCode">
False
</pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_37" style="">
<span class="com">// System set to en-GB culture</span><span class="pln">
</span><span class="kwd">bool</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">TryParse</span><span class="pun">(</span><span class="str">"11/24/2015"</span><span class="pun">,</span><span class="pln"> out parsedValue</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">result</span><span class="pun">);</span></pre>

<pre class="ipsCode" id="ips_uid_7137_41">
False</pre>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_43" style="">
<span class="com">// System set to en-GB culture</span><span class="pln">
</span><span class="kwd">bool</span><span class="pln"> result </span><span class="pun">=</span><span class="pln"> </span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">TryParse</span><span class="pun">(</span><span class="str">"10/11/2015"</span><span class="pun">,</span><span class="pln"> out parsedValue</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">result</span><span class="pun">);</span></pre>

<pre class="ipsCode">
True
</pre>

<p>
	في المثال اﻷخير، لاحظ أنه إذا كنت تَمكُث في الولايات المتحدة الأمريكية بينما إعدادات مَحلّيّة نِظامك مَضبْوطة على <code>en-GB</code>، فقد تُفاجئ بأن النتيجة هي 10 نوفمبر وليس 11 أكتوبر.
</p>

<p>
	تَستقبِل بصمة اخرى من نفس التابع <code>TryParse(string, IFormatProvider, DateTimeStyles, out DateTime)‎</code> مُعامِلًا من النوع <code>IFormatProvider</code> بِخِلاف تابعه الشقيق، وذلك لتحديد مَحلّيّة (Culture) صِيْغة التنسيق (Format)، والتي تَؤول إلى مَحلّيّة النظام في حالة تمرير قيمة فارغة <code>null</code>. يَسمَح هذا التابع أيضًا بتحديد صِيْغة التنسيق من خلال مُعامِل من النوع تِعداد (Enum) من الصنف <code>DateTimeStyles</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_45" style="">
<span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">DateTime</span><span class="pun">.</span><span class="typ">TryParse</span><span class="pun">(</span><span class="str">" monkey "</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="typ">CultureInfo</span><span class="pun">(</span><span class="str">"en-GB"</span><span class="pun">),</span><span class="pln">
</span><span class="typ">DateTimeStyles</span><span class="pun">.</span><span class="typ">AllowLeadingWhite</span><span class="pln"> </span><span class="pun">|</span><span class="pln"> </span><span class="typ">DateTimeStyles</span><span class="pun">.</span><span class="typ">AllowTrailingWhite</span><span class="pun">,</span><span class="pln"> out parsedValue</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Apparently, ' monkey ' is a date/time value. Who knew?"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	اعتراضات (Exceptions)
</h3>

<p>
	في بعض الحالات المُحدَّدة، قد يُبَلِّغ هذا التابع عن إعتراضات (Exceptions)، تَتَّعلّق بمُعامِلات الدخْل التي أُضيفت خلال التحميل الزائد للتابع (Method Overloading). بالتحديد مُعامِل الواجهة <code>IFormatProvider</code> ومُعامِل التعداد من الصنف <code>DateTimeStyles</code>.
</p>

<p>
	الاعتراضات المُحتملة:
</p>

<ul>
<li>
		<p>
			اعتراض من النوع <code>NotSupportedException</code>: إذا كانت قيمة وسيط المُعامِل <code>IFormatProvider</code> مُحايدة.
		</p>
	</li>
	<li>
		<p>
			اعتراض من النوع <code>ArgumentException</code>: إمّا لعدم صلاحية قيمة وسيط المُعامِل <code>DateTimeStyles</code> أو لاحِتواءُه على قيم مُتعارِضة مثل <code>AssumeUniversal</code> و<code>AssumeLocal</code>.
		</p>
	</li>
</ul>
<h2>
	التابع <code>TryParseExact</code>
</h2>

<p>
	يُعدّ هذا التابع تَجميِعة لكلًا من التابعين <code>TryParse</code> و<code>ParseExact</code>؛ فهو يَسمَح - مثل التابع <code>ParseExact</code> - بتحديد صِيْغ سلسلة التنسيق (Format Strings) مُخصصة، كما يُعِيد - مثل التابع <code>TryParse</code> - قيمة منطقية <code>Boolean</code> تُحدد إذا ما حُللّت السلسلة النصية بنجاح أم لا، بدلًا من التبلّيغ عن إعتراض (Exception) في حالة الفشل.
</p>

<p>
	تحاول البصمة <code>TryParseExact(string, string, IFormatProvider, DateTimeStyles, out DateTime)‎</code> من التابع تحليل السلسلة النصية المُعطاة وِفقًا لصِيْغة سلسلة التنسيق (Format String) مُحددة. لابّد للسلسلة النصية أن تَتَلائَم مع الصِيْغة لِضمان تحليل ناجح.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_47" style="">
<span class="typ">DateTime</span><span class="pun">.</span><span class="typ">TryParseExact</span><span class="pun">(</span><span class="str">"11242015"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"MMddyyyy"</span><span class="pun">,</span><span class="pln"> null</span><span class="pun">,</span><span class="pln"> </span><span class="typ">DateTimeStyles</span><span class="pun">.</span><span class="typ">None</span><span class="pun">,</span><span class="pln"> out parsedValue</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span></pre>

<p>
	تحاول البصمة <code>TryParseExact(string, string[], IFormatProvider, DateTimeStyles, out DateTime)‎</code> من التابع تحليل السلسلة النصية المُعطاة وِفقًا لمصفوفة من صِيْغ سلسلة التنسيق (Format Strings). لابّد للسلسلة النصية أن تَتَلائَم مع صِيْغة واحدة على الأقل لِضمان تحليل ناجح.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7137_49" style="">
<span class="typ">DateTime</span><span class="pun">.</span><span class="typ">TryParseExact</span><span class="pun">(</span><span class="str">"11242015"</span><span class="pun">,</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span class="pun">[]</span><span class="pln"> </span><span class="pun">{</span><span class="pln"> </span><span class="str">"yyyy-MM-dd"</span><span class="pun">,</span><span class="pln"> </span><span class="str">"MMddyyyy"</span><span class="pln"> </span><span class="pun">},</span><span class="pln"> null</span><span class="pun">,</span><span class="pln"> </span><span class="typ">DateTimeStyles</span><span class="pun">.</span><span class="typ">None</span><span class="pun">,</span><span class="pln"> out parsedValue</span><span class="pun">);</span><span class="pln"> </span><span class="com">// true</span></pre>

<p>
	ترجمة -وبتصرف- للفصل DateTime parsing من كتاب <a href="https://goalkicker.com/DotNETFrameworkBook/" rel="external nofollow">‎.NET Framework Notes for Professionals</a>
</p>
]]></description><guid isPermaLink="false">944</guid><pubDate>Wed, 29 Jul 2020 13:35:28 +0000</pubDate></item><item><title>&#x645;&#x642;&#x62F;&#x645;&#x629; &#x625;&#x644;&#x649; &#x625;&#x637;&#x627;&#x631; &#x639;&#x645;&#x644; dot NET</title><link>https://academy.hsoub.com/programming/c-sharp/dotnet/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D8%A5%D9%84%D9%89-%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-dot-net-r943/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2020_07/1.png.7594796726a9001c063943030f24a241.png" /></p>
<h2>
	التصريف في الوقت المناسب (JIT compilation)
</h2>

<p>
	يَعتمِد إطار عمل <code>‎.NET framework</code> على التَصرِّيف في الوقت المناسب (Just-In-Time compilation)، والذي يَختلف عن كلًا من التَصرِّيف المُسبَق (Ahead-of-time compilation) والتفسير (Interpretation).
</p>

<p>
	باختصار، لا تُصرَّف الشيفرة المصدرية (source code) المكتوبة بأيّ من اللغات المُدعَّمة مثل C#‎ أو F#‎ أو Visual Basic إلى لغة الآلة (machine code) مُباشرة كما في التَصرِّيف المُسبَق (AOT compilation)، وإنما تُصرَّف أولًا إلى اللغة الوسيطة المشتركة <code>(Common Intermediate Language (CIL</code>، وهي لغة مُنخَفِضة المستوى وقريبة من لغة الآلة ولكنها غير مُرتبطة بمنصة (platform) معينة.
</p>

<p>
	تُنفَّذ شيفرة اللغة الوسيطة داخل بيئة تَّنفيذ افتراضية تُسمى بيئة التَّنفيذ المُشتركة <code>Common Language Runtime (CLR)</code> <a href="https://academy.hsoub.com/programming/general/%D8%A5%D8%B7%D8%A7%D8%B1-%D8%B9%D9%85%D9%84-framework/" rel="">بإطار عمل</a> <code>‎.NET framework</code>. تَتضمَّن هذه البيئة مُصرِّف آني وقت التَّنفيذ <code>JIT compiler</code>، والذي يُصرِّف تلك اللغة الوسيطة أثناء زمن التَّنفيذ (runtime) إلى لغة الآلة الخاصة بالمنصة التي تُنفَّذ عليها الشيفرة.
</p>

<h2>
	بيئة التنفيذ المشتركة (CLR)
</h2>

<p>
	تُعدّ بيئة التَّنفيذ المشتركة <code>Common Language Runtime (CLR)‎</code> جزءً أساسيًا من إطار عمل <code>‎.NET framework</code>. وهي بالأساس بيئة تَّنفيذ افتراضية، وتَتضمَّن التالي:
</p>

<ul>
	<li>
		لغة بايتكود مَحمولة تُعرَف باسم اللغة المشتركة الوسيطة <code>Common Intermediate Language (CIL or IL)‎</code>.
	</li>
	<li>
		مُصرِّف آني وقت التَّنفيذ <code>JIT compiler</code>، يُحوِّل شيفرة البايت (bytecode) إلى لغة الآلة الفعلّية (machine code) عند الحاجة.
	</li>
	<li>
		كَانِس مُهملات (garbage collector) والذي يُوفِّر إدارة أوتوماتيكية للذاكرة.
	</li>
	<li>
		تَستخدِم عمليات فرعية (sub-processes) مُنفصلة تُعرَف باسم <code>AppDomains</code> لضمان عزل البرامج.
	</li>
	<li>
		تَستخدِم العديد من أساليب تَوفِّير الآمان مثل التَحقُّق من الشيفرة (verifiable code) ومستويات الثقة (trust levels).
	</li>
</ul>

<p>
	عادةً ما يُشار إلى الشيفرة التي تُنفَّذ داخل بيئة التَّنفيذ المشتركة (CLR) باسم الشيفرة المُدارة (managed code) بخلاف الشيفرة التي تُنفَّذ خارجها، ويُشار إليها بطبيعة الحال باسم الشيفرة غير المُدارة (unmanaged code). تَتوفَّر العديد من الطرائق لتسهيل التعامل بين الشيفرات من كلا النوعين.
</p>

<h2>
	مثال "أهلًا بالعالم"
</h2>

<p>
	على الرغم من شيوع استخدام كلًا من اللغات C#‎، و Visual Basic و F#‎ بإطار عمل <code>‎.NET</code>، يُمكن أيضًا لأي لغة برمجية -متوافقة مع معايير البنية التحتية للغة الوسيطة <code>(Common Language Infrastructure CLI)</code>- أن تُصرَّف إلى اللغة الوسيطة المشتركة (CIL)، وتُنفَّذ ببيئة التَّنفيذ المُشتركة (CLR).
</p>

<h3>
	لغة C#‎
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4352_7" style=""><span class="kwd">using</span><span class="pln"> </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">class</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="com">// هذه الدالة هي أول ما يُنفذ بالبرنامج</span><span class="pln">
    </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">()</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
        </span><span class="com">// أرسل السلسلة النصية "أهلًا بالعالم" إلى الخرج القياسي</span><span class="pln">
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Hello World"</span><span class="pun">);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يوجد العديد من التحميلات الزائدة للتابع <code>Console.WriteLine</code>. في المثال باﻷعلى، السِلسِلة النصية <code>Hello World</code> هي مُعامِل للتابع. عند تنفيذ البرنامج، يُرسل التابع السِلسِلة النصية المُمررة إليه <code>Hello World</code> إلى مجرى الخْرج القياسي.
</p>

<p>
	تَستدعي بعض التحميلات الزائدة (overloads) الآخرى التابع <code>ToString</code> من خلال الوسيط، قبل أن تُرسل النتيجة إلى مجرى الخْرج القياسي. اطلع على <a href="https://docs.microsoft.com/en-us/dotnet/api/system.console.writeline?redirectedfrom=MSDN&amp;view=netcore-3.1#overloads" rel="external nofollow">توثيق إطار عمل .NET</a> لمزيد من المعلومات.
</p>

<p>
	<a href="https://dotnetfiddle.net/S7hjxp" rel="external nofollow">رابط مثال حي</a>
</p>

<p>
	الشيفرة المكافئة باللغة الوسيطة IL (والتي ستُصرَّف باستخدام مُصرِّف آني وقت التَّنفيذ JIT):
</p>

<pre class="ipsCode" id="ips_uid_4352_9">// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0
// Copyright (c) Microsoft Corporation. All rights reserved.
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly HelloWorld
{
.custom instance void
[mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void
[mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00
54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype
[mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00
0A 48 65 6C 6C 6F 57 6F 72 6C 64 00 00 ) // ...HelloWorld..
.custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = (
01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) =
( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( 01
00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( 01
00 0A 48 65 6C 6C 6F 57 6F 72 6C 64 00 00 ) // ...HelloWorld..
.custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( 01
00 12 43 6F 70 79 72 69 67 68 74 20 C2 A9 20 // ...Copyright ..
20 32 30 31 37 00 00 ) // 2017..
.custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( 01
00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) =
( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01
00 24 33 30 38 62 33 64 38 36 2D 34 31 37 32 // ..$308b3d86-4172
2D 34 30 32 32 2D 61 66 63 63 2D 33 66 38 65 33 // -4022-afcc-3f8e3
32 33 33 63 35 62 30 00 00 ) // 233c5b0..
.custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = (
01 00 07 31 2E 30 2E 30 2E 30 00 00 ) // ...1.0.0.0..
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string)
= ( 01 00 1C 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B // ....NETFramework
2C 56 65 72 73 69 6F 6E 3D 76 34 2E 35 2E 32 01 // ,Version=v4.5.2.
00 54 0E 14 46 72 61 6D 65 77 6F 72 6B 44 69 73 // .T..FrameworkDis
70 6C 61 79 4E 61 6D 65 14 2E 4E 45 54 20 46 72 // playName..NET Fr
61 6D 65 77 6F 72 6B 20 34 2E 35 2E 32 ) // amework 4.5.2
.hash algorithm 0x00008004
.ver 1:0:0:0
}
.module HelloWorld.exe
// MVID: {2A7E1D59-1272-4B47-85F6-D7E1ED057831}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00020003 // ILONLY 32BITPREFERRED
// Image base: 0x0000021C70230000
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi beforefieldinit HelloWorld.Program
extends [mscorlib]System.Object
{
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Hello World"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Program::Main
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: nop
IL_0007: ret
} // end of method Program::.ctor
} // end of class HelloWorld.Program
Generated with MS ILDASM tool (IL disassembler)
</pre>

<h3>
	لغة F#‎
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4352_11" style=""><span class="pln">open </span><span class="typ">System</span><span class="pln">
</span><span class="pun">[&lt;</span><span class="typ">EntryPoint</span><span class="pun">&gt;]</span><span class="pln">
let main argv </span><span class="pun">=</span><span class="pln">
        printfn </span><span class="str">"Hello World"</span><span class="pln">
        </span><span class="lit">0</span><span class="pln">        </span></pre>

<p>
	<a href="https://dotnetfiddle.net/hDvqwC" rel="external nofollow">رابط مثال حي</a>
</p>

<h3>
	لغة Visual Basic
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4352_13" style=""><span class="typ">Imports</span><span class="pln"> </span><span class="typ">System</span><span class="pln">
</span><span class="typ">Module</span><span class="pln"> </span><span class="typ">Program</span><span class="pln">
    </span><span class="typ">Public</span><span class="pln"> </span><span class="typ">Sub</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">()</span><span class="pln">
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Hello World"</span><span class="pun">)</span><span class="pln">
    </span><span class="typ">End</span><span class="pln"> </span><span class="typ">Sub</span><span class="pln">
</span><span class="typ">End</span><span class="pln"> </span><span class="typ">Module</span></pre>

<p>
	<a href="https://dotnetfiddle.net/dRDZVe" rel="external nofollow">رابط مثال حي</a>
</p>

<h3>
	لغة C++/CLI
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4352_15" style=""><span class="kwd">using</span><span class="pln"> </span><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">System</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> main</span><span class="pun">(</span><span class="pln">array</span><span class="pun">&lt;</span><span class="typ">String</span><span class="pun">^&gt;^</span><span class="pln"> args</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Console</span><span class="pun">::</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Hello World"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	اللغة الوسيطة IL
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4352_17" style=""><span class="pun">.</span><span class="kwd">class</span><span class="pln"> </span><span class="kwd">public</span><span class="pln"> </span><span class="kwd">auto</span><span class="pln"> ansi beforefieldinit </span><span class="typ">Program</span><span class="pln">
extends </span><span class="pun">[</span><span class="pln">mscorlib</span><span class="pun">]</span><span class="typ">System</span><span class="pun">.</span><span class="typ">Object</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
    </span><span class="pun">.</span><span class="pln">method </span><span class="kwd">public</span><span class="pln"> hidebysig </span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> </span><span class="typ">Main</span><span class="pun">()</span><span class="pln"> cil managed
    </span><span class="pun">{</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">maxstack </span><span class="lit">8</span><span class="pln">
        IL_0000</span><span class="pun">:</span><span class="pln"> nop
        IL_0001</span><span class="pun">:</span><span class="pln"> ldstr </span><span class="str">"Hello World"</span><span class="pln">
        IL_0006</span><span class="pun">:</span><span class="pln"> call </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">[</span><span class="pln">mscorlib</span><span class="pun">]</span><span class="typ">System</span><span class="pun">.</span><span class="typ">Console</span><span class="pun">::</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="pln">string</span><span class="pun">)</span><span class="pln">
        IL_000b</span><span class="pun">:</span><span class="pln"> nop
        IL_000c</span><span class="pun">:</span><span class="pln"> ret
    </span><span class="pun">}</span><span class="pln">

    </span><span class="pun">.</span><span class="pln">method </span><span class="kwd">public</span><span class="pln"> hidebysig specialname rtspecialname
    instance </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">.</span><span class="pln">ctor</span><span class="pun">()</span><span class="pln"> cil managed
    </span><span class="pun">{</span><span class="pln">
        </span><span class="pun">.</span><span class="pln">maxstack </span><span class="lit">8</span><span class="pln">
        IL_0000</span><span class="pun">:</span><span class="pln"> ldarg</span><span class="pun">.</span><span class="lit">0</span><span class="pln">
        IL_0001</span><span class="pun">:</span><span class="pln"> call instance </span><span class="kwd">void</span><span class="pln"> </span><span class="pun">[</span><span class="pln">mscorlib</span><span class="pun">]</span><span class="typ">System</span><span class="pun">.</span><span class="typ">Object</span><span class="pun">::.</span><span class="pln">ctor</span><span class="pun">()</span><span class="pln">
        IL_0006</span><span class="pun">:</span><span class="pln"> ret
    </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3>
	لغة PowerShell
</h3>

<pre class="ipsCode">Write-Host "Hello World"
</pre>

<h3>
	لغة Nemerle
</h3>

<pre class="ipsCode">System.Console.WriteLine("Hello World");
</pre>

<h3>
	لغة Python
</h3>

<pre class="ipsCode prettyprint lang-py prettyprinted" id="ips_uid_4352_20" style=""><span class="kwd">print</span><span class="pln"> </span><span class="str">"Hello World"</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> clr
</span><span class="kwd">from</span><span class="pln"> </span><span class="typ">System</span><span class="pln"> </span><span class="kwd">import</span><span class="pln"> </span><span class="typ">Console</span><span class="pln">
</span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">"Hello World"</span><span class="pun">)</span></pre>

<h3>
	لغة Oxygene
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4352_22" style=""><span class="kwd">namespace</span><span class="pln"> </span><span class="typ">HelloWorld</span><span class="pun">;</span><span class="pln">

interface

type
    </span><span class="typ">App</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">class</span><span class="pln">
    </span><span class="kwd">public</span><span class="pln">
            </span><span class="kwd">class</span><span class="pln"> method </span><span class="typ">Main</span><span class="pun">(</span><span class="pln">args</span><span class="pun">:</span><span class="pln"> array of </span><span class="typ">String</span><span class="pun">);</span><span class="pln">
    end</span><span class="pun">;</span><span class="pln">


implementation


</span><span class="kwd">class</span><span class="pln"> method </span><span class="typ">App</span><span class="pun">.</span><span class="typ">Main</span><span class="pun">(</span><span class="pln">args</span><span class="pun">:</span><span class="pln"> array of </span><span class="typ">String</span><span class="pun">);</span><span class="pln">
begin
        </span><span class="typ">Console</span><span class="pun">.</span><span class="typ">WriteLine</span><span class="pun">(</span><span class="str">'Hello World'</span><span class="pun">);</span><span class="pln">
end</span><span class="pun">;</span><span class="pln">




end</span><span class="pun">.</span></pre>

<h3>
	لغة Boo
</h3>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4352_24" style=""><span class="pln">print </span><span class="str">"Hello World"</span></pre>

<h2>
	1.4: إصدارات إطار عمل ‎.NET
</h2>

<p>
	إطار عمل ‎.NET
</p>

<table>
	<thead>
		<tr>
			<th style="text-align:center">
				الإصدار
			</th>
			<th style="text-align:center">
				تاريخ الإصدار
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_1.0" rel="external nofollow">1.0</a>
			</td>
			<td style="text-align:center">
				13 فبراير 2002
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_1.1" rel="external nofollow">1.1</a>
			</td>
			<td style="text-align:center">
				24 أبريل 2003
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_2.0" rel="external nofollow">2.0</a>
			</td>
			<td style="text-align:center">
				07 نوفمبر 2005
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_3.0" rel="external nofollow">3.0</a>
			</td>
			<td style="text-align:center">
				06 نوفمبر 2006
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_3.5" rel="external nofollow">3.5</a>
			</td>
			<td style="text-align:center">
				19 نوفمبر 2007
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#Service_Pack_1" rel="external nofollow">3.5 SP1</a>
			</td>
			<td style="text-align:center">
				11 أغسطس 2008
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_4" rel="external nofollow">4.0</a>
			</td>
			<td style="text-align:center">
				12 أبريل 2010
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_4.5" rel="external nofollow">4.5</a>
			</td>
			<td style="text-align:center">
				15 أغسطس 2012
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_4.5.1" rel="external nofollow">4.5.1</a>
			</td>
			<td style="text-align:center">
				17 أكتوبر 2013
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_4.5.2" rel="external nofollow">4.5.2</a>
			</td>
			<td style="text-align:center">
				05 مايو 2014
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_4.6" rel="external nofollow">4.6</a>
			</td>
			<td style="text-align:center">
				20 يوليو 2015
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_4.6.1" rel="external nofollow">4.6.1</a>
			</td>
			<td style="text-align:center">
				17 نوفمبر 2015
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_4.6.2" rel="external nofollow">4.6.2</a>
			</td>
			<td style="text-align:center">
				02 أغسطس 2016
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://en.wikipedia.org/wiki/.NET_Framework_version_history#.NET_Framework_4.7" rel="external nofollow">4.7</a>
			</td>
			<td style="text-align:center">
				05 أبريل 2017
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				<a href="https://devblogs.microsoft.com/dotnet/announcing-the-net-framework-4-7-1/" rel="external nofollow">4.7.1</a>
			</td>
			<td style="text-align:center">
				17 أكتوبر 2017
			</td>
		</tr>
	</tbody>
</table>

<p>
	إطار عمل ‎.NET Compact
</p>

<table>
	<thead>
		<tr>
			<th style="text-align:center">
				الإصدار
			</th>
			<th style="text-align:center">
				تاريخ الإصدار
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td style="text-align:center">
				1.0
			</td>
			<td style="text-align:center">
				01 يناير 2000
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				2.0
			</td>
			<td style="text-align:center">
				01 أكتوبر 2005
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				3.5
			</td>
			<td style="text-align:center">
				19 نوفمبر 2007
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				3.7
			</td>
			<td style="text-align:center">
				01 يناير 2009
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				3.9
			</td>
			<td style="text-align:center">
				01 يونيو 2013
			</td>
		</tr>
	</tbody>
</table>

<p>
	إطار عمل ‎.NET Micro
</p>

<table>
	<thead>
		<tr>
			<th style="text-align:center">
				الإصدار
			</th>
			<th style="text-align:center">
				تاريخ الإصدار
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td style="text-align:center">
				4.2
			</td>
			<td style="text-align:center">
				04 أكتوبر 2011
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				4.3
			</td>
			<td style="text-align:center">
				04 ديسمبر 2012
			</td>
		</tr>
		<tr>
			<td style="text-align:center">
				4.4
			</td>
			<td style="text-align:center">
				20 أكتوبر 2015
			</td>
		</tr>
	</tbody>
</table>
<style type="text/css">
table {
    width: 100%;
}

thead {
    vertical-align: middle;
    text-align: center;
}

td, th {
    border: 1px solid #dddddd;
    text-align: right;
    padding: 8px;
    text-align: inherit;

}
tr:nth-child(even) {
    background-color: #dddddd;
}</style>
<p>
	ترجمة -وبتصرف- للفصل Getting started with .NET Framework من كتاب <a href="https://goalkicker.com/DotNETFrameworkBook/" rel="external nofollow">‎.NET Framework Notes for Professionals</a>
</p>
]]></description><guid isPermaLink="false">943</guid><pubDate>Sun, 02 Aug 2020 13:02:00 +0000</pubDate></item></channel></rss>
