<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Jérôme Lambert &#187; Linq</title>
	<atom:link href="https://blog.developpez.com/jerome/pcategory/net/linq/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/jerome</link>
	<description>My Microsoft Development World</description>
	<lastBuildDate>Mon, 17 Dec 2012 11:34:42 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>#4 Les opérateurs de requête Linq de Aggregate à Where : SequenceEqual</title>
		<link>https://blog.developpez.com/jerome/p8113/net/4_les_operateurs_de_requete_linq_de_aggr</link>
		<comments>https://blog.developpez.com/jerome/p8113/net/4_les_operateurs_de_requete_linq_de_aggr#comments</comments>
		<pubDate>Sun, 27 Sep 2009 23:00:00 +0000</pubDate>
		<dc:creator><![CDATA[Jérôme Lambert]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[C&#8217;est officiel, les vacances sont finies et donc retour difficile à la réalité mais c&#8217;est quand même avec grand plaisir que je reprends du service avec cette série d&#8217;astuces sur Linq Pour recommencer, on va y aller en douceur en abordant l&#8217;opérateur SequenceEqual. Alors. Comment faîtes-vous pour déterminer si deux listes ont les mêmes éléments ? (je parle bien des mêmes instances) Quelque chose comme ceci ? var membres1 = GetMembresDeveloppez(); var membres2 = GetMembresDeveloppez(); [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>C&rsquo;est officiel, les vacances sont finies et donc retour difficile à la réalité mais c&rsquo;est quand même avec grand plaisir que je reprends du service avec cette série d&rsquo;astuces sur Linq <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> Pour recommencer, on va y aller en douceur en abordant l&rsquo;opérateur <strong>SequenceEqual</strong>.</p>
<p>Alors. Comment faîtes-vous pour déterminer si deux listes ont les mêmes éléments ? (je parle bien des mêmes instances)</p>
<p>Quelque chose comme ceci ?</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">var</font><font color="#000000"> membres1 = GetMembresDeveloppez();          <br /></font><font color="#0000ff">var</font><font color="#000000"> membres2 = GetMembresDeveloppez();          </p>
<p></font><font color="#0000ff">if</font><font color="#000000"> (membres1.Count == membres2.Count)          <br />{           <br />        </font><font color="#0000ff">foreach</font><font color="#000000"> (</font><font color="#0000ff">var</font><font color="#000000"> currentMembre </font><font color="#0000ff">in</font><font color="#000000"> membres1)          <br />        {           <br />                </font><font color="#0000ff">if</font><font color="#000000"> (membres2.Contains(currentMembre) == </font><font color="#0000ff">false</font><font color="#000000">)          <br />                        </font><font color="#0000ff">return</font><font color="#000000"> </font><font color="#0000ff">false</font><font color="#000000">;          <br />        }           </p>
<p>        </font><font color="#0000ff">return</font><font color="#000000"> </font><font color="#0000ff">true</font><font color="#000000">;          <br />}           <br /></font><font color="#0000ff">else          <br /></font><font color="#000000">{          <br />        </font><font color="#0000ff">return</font><font color="#000000"> </font><font color="#0000ff">false</font><font color="#000000">;          <br />}</font></font> </div>
</p></div>
<p>Avec Linq, l&rsquo;opérateur SequenceEqual s&rsquo;occupera de faire toute la comparaison pour vous :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">var</font><font color="#000000"> membres1 = GetMembresDeveloppez();          <br /></font><font color="#0000ff">var</font><font color="#000000"> membres2 = GetMembresDeveloppez();          </p>
<p></font><font color="#0000ff">bool</font><font color="#000000"> result1 = membres1.SequenceEqual(membres2); </font><font color="#008000">// Faux          <br /></font><font color="#0000ff">bool</font><font color="#000000"> result2 = membres1.SequenceEqual(membres1); </font><font color="#008000">// Vrai          <br /></font><font color="#0000ff">bool</font><font color="#000000"> result3 = membres1.SequenceEqual(membres1.ToList()); </font><font color="#008000">// Vrai</font></font> </div>
</p></div>
<p>Facile ? <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p><a href="http://jlambert.developpez.com/sources/LinqOperatorsSolution.zip"><strong><font color="#008000">Téléchargez les sources (sous Visual Studio 2008)</font></strong></a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>#9 Les opérateurs de requête Linq de Aggregate à Where : Single &amp; SingleOrDefault</title>
		<link>https://blog.developpez.com/jerome/p8181/net/9_les_operateurs_de_requete_linq_de_aggr</link>
		<comments>https://blog.developpez.com/jerome/p8181/net/9_les_operateurs_de_requete_linq_de_aggr#comments</comments>
		<pubDate>Sun, 11 Oct 2009 23:30:50 +0000</pubDate>
		<dc:creator><![CDATA[Jérôme Lambert]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Aujourd&#8217;hui pour bien commencer la semaine, on va aborder deux opérateurs que j&#8217;affectionne tout particulièrement : Single et SingleOrDefault. Pour ces opérateurs, on va devoir préciser notre classe MembreDeveloppez en y ajoutant un champ ID qui représente un identifiant unique pour chaque membre de developpez.com. public class MembreDeveloppez : IComparable&#60;MembreDeveloppez&#62; {         public int ID { get; set; }         public string Nom { get; set; }         public int NombreMessages { get; set; }         // &#8230; } Et [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Aujourd&rsquo;hui pour bien commencer la semaine, on va aborder deux opérateurs que j&rsquo;affectionne tout particulièrement : <strong>Single</strong> et <strong>SingleOrDefault</strong>.</p>
<p>Pour ces opérateurs, on va devoir préciser notre classe <em>MembreDeveloppez</em> en y ajoutant un champ <em>ID</em> qui représente un identifiant unique pour chaque membre de developpez.com.</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">class</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> : </font><font color="#2b91af">IComparable&lt;</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000">         <br />{          <br />        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">int</font><font color="#000000"> ID { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font><font color="#000000">; }         <br />        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">string</font><font color="#000000"> Nom { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font><font color="#000000">; }         <br />        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">int</font><font color="#000000"> NombreMessages { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font><font color="#000000">; }         </p>
<p>        </font><font color="#008000">// &#8230;</font><font color="#000000">         <br />}</font></font> </div>
</p></div>
<p>Et au passage, voici la nouvelle implémentation de la méthode <em>GetMembresDeveloppez()</em> qui (pour ceux qui n&rsquo;auraient pas suivi) retourne une liste d&rsquo;instances de la classe MembreDeveloppez :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">static</font><font color="#000000"> </font><font color="#2b91af">List</font>&lt;<font color="#2b91af">MembreDeveloppez</font><font color="#000000">&gt; GetMembresDeveloppez()         <br />{          <br />        </font><font color="#0000ff">return</font><font color="#000000"> </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#2b91af">List</font>&lt;<font color="#2b91af">MembreDeveloppez</font><font color="#000000">&gt;()  <br />        {  <br />                </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">(){ ID=1, Nom=</font><font color="#a31515">&laquo;&nbsp;Jérôme Lambert&nbsp;&raquo;</font><font color="#000000">, NombreMessages = 3000},         <br />                </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">(){ ID=2, Nom=</font><font color="#a31515">&laquo;&nbsp;Louis-Guillaume Morand&nbsp;&raquo;</font><font color="#000000">, NombreMessages = 2500},         <br />                </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">(){ ID=3, Nom=</font><font color="#a31515">&laquo;&nbsp;Aspic&nbsp;&raquo;</font><font color="#000000">, NombreMessages = 1200},         <br />                </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">(){ ID=4, Nom=</font><font color="#a31515">&laquo;&nbsp;Dev01&Prime;</font><font color="#000000">, NombreMessages = 530},         <br />                </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">(){ ID=5, Nom=</font><font color="#a31515">&laquo;&nbsp;Giovanny Temgoua&nbsp;&raquo;</font><font color="#000000">, NombreMessages = 8300},         <br />                </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">(){ ID=6, Nom=</font><font color="#a31515">&laquo;&nbsp;LefortLudovic&nbsp;&raquo;</font><font color="#000000">, NombreMessages = 1200},         <br />                </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">(){ ID=7, Nom=</font><font color="#a31515">&laquo;&nbsp;nico-pyright(c)&nbsp;&raquo;</font><font color="#000000">, NombreMessages = 660},         <br />                </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">(){ ID=8, Nom=</font><font color="#a31515">&laquo;&nbsp;Skyounet&nbsp;&raquo;</font><font color="#000000">, NombreMessages = 4300},         <br />                </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">(){ ID=9, Nom=</font><font color="#a31515">&laquo;&nbsp;Smyley&nbsp;&raquo;</font><font color="#000000">, NombreMessages = 2200}         <br />                </font><font color="#008000">// &#8230;</font><font color="#000000">         <br />        };          <br />}</font></font> </div>
</p></div>
<p>Maintenant la question du jour : comment feriez-vous pour récupérer un membre de developpez.com sur base de son identifiant ? On va prendre comme exemple le membre <strong>Skyounet</strong> avec l&rsquo;identifiant <strong>8</strong>.</p>
<p>J&rsquo;ai l&rsquo;impression que certains, qui ont suivi cette série de billets depuis le début, ont envie de proposer une solution avec l&rsquo;opérateur <strong><a href="http://blog.developpez.com/jerome/p7933/net/2-les-operateurs-de-requete-linq-de-aggr/" target="_blank">First</a></strong> (voir <strong><a href="http://blog.developpez.com/jerome/p7933/net/2-les-operateurs-de-requete-linq-de-aggr/" target="_blank">FirstOrDefault</a></strong>) :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">var</font><font color="#000000"> membres = SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">.GetMembresDeveloppez();         </p>
<p>SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> membreID8 = membres.First(membre => membre.ID == 8);</font></font> </div>
</p></div>
<p>Et bien pas de chance mais ce n&rsquo;est pas tout à fait juste car on parle bien d&rsquo;identifiant <strong><u>unique</u></strong>. Or avec l&rsquo;opérateur <strong>First</strong> (ou <strong>FirstOrDefault</strong>), on récupère que le premier élément de la séquence résultante, or, si notre séquence venait à contenir plus d&rsquo;un membre avec l&rsquo;identifiant 8, il y aurait un réel problème au niveau de l&rsquo;intégrité de vos données et pire encore, vous auriez fermé les yeux face à ce cas.</p>
<p>Le code suivant va donc s&rsquo;exécuter correctement mais vous passerez à côté du fait que deux membres ont l&rsquo;identifiant 8 :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">var</font><font color="#000000"> membres = SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">.GetMembresDeveloppez();         <br />membres.Add(</font><font color="#0000ff">new</font><font color="#000000"> SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">() { ID = 8, Nom = </font><font color="#a31515">&laquo;&nbsp;Inconnu numéro 8&Prime;</font><font color="#000000">, NombreMessages = 0 });         </p>
<p>SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> membreID8 = membres.First(membre => membre.ID == 8);</font></font> </div>
</p></div>
<p>C&rsquo;est là que notre opérateur <strong>Single</strong> va être intéressant car il renverra une exception dans deux cas :</p>
<ol>
<li>Lorsqu&rsquo;il n&rsquo;y aura pas d&rsquo;élément dans notre résultat (comme avec First d&rsquo;ailleurs)</li>
<li>Lorsqu&rsquo;il y aura plus d&rsquo;un élément dans notre résultat !</li>
</ol>
<p>Le second cas répond donc exactement à notre problématique :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">var</font><font color="#000000"> membres = SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">.GetMembresDeveloppez();         <br />membres.Add(</font><font color="#0000ff">new</font><font color="#000000"> SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">() { ID = 8, Nom = </font><font color="#a31515">&laquo;&nbsp;Inconnu numéro 8&Prime;</font><font color="#000000">, NombreMessages = 0 });         </p>
<p></font><font color="#0000ff">try         <br /></font><font color="#000000">{         <br />        SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> membreID7 = membres.Single(membre => membre.ID == 7);         <br />        </font><font color="#008000">//SampleLibrary.MembreDeveloppez membreID8 = membres.Single(membre => membre.ID == 8); // => Génère une exception         <br /></font><font color="#000000">        </font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Le membre avec l&rsquo;identifiant 8 est {0}&nbsp;&raquo;</font><font color="#000000">, membreID7.Nom);         <br />}          <br /></font><font color="#0000ff">catch</font><font color="#000000"> (System.</font><font color="#2b91af">Exception</font><font color="#000000"> exc)         <br />{          <br />        </font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;La requête n&rsquo;a pas renvoyé un et un seul membre.&nbsp;&raquo;</font><font color="#000000">);         <br />}</font></font> </div>
</p></div>
<p>Pour ce qui est de l&rsquo;opérateur <strong>SingleOrDefault</strong>, il se comporte comme <strong>Single</strong> excepté le fait qu&rsquo;il renverra <em>null</em> lorsque le résultat n&rsquo;aura pas d&rsquo;élément (contrairement à <strong>Single</strong> qui génèrera une exception).</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">try         <br /></font><font color="#000000">{         <br />        SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> membreID1000 = membres.SingleOrDefault(membre => membre.ID == 1000);         <br />        </font><font color="#0000ff">if</font><font color="#000000"> (membreID1000 != </font><font color="#0000ff">null</font><font color="#000000">)         <br />        {          <br />                </font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Le membre avec l&rsquo;identifiant 1000 est {0}&nbsp;&raquo;</font><font color="#000000">, membreID1000.Nom);         <br />        }          <br />        </font><font color="#0000ff">else         <br /></font><font color="#000000">        {         <br />                </font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Il n&rsquo;existe pas de membre avec l&rsquo;identifiant 1000.&nbsp;&raquo;</font><font color="#000000">);         <br />        }          <br />}          <br /></font><font color="#0000ff">catch</font><font color="#000000"> (System.</font><font color="#2b91af">Exception</font><font color="#000000"> exc)         <br />{          <br />        </font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;La requête n&rsquo;a pas renvoyé un et un seul membre.&nbsp;&raquo;</font><font color="#000000">);         <br />}</font></font> </div>
</p></div>
</p>
<p>Alors fan ou pas ?! <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /></p>
<p> </p>
<p><a href="http://jlambert.developpez.com/sources/LinqOperatorsSolution.zip"><strong><font color="#008000">Téléchargez les sources (sous Visual Studio 2008)</font></strong></a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>#11 Les opérateurs de requête Linq de Aggregate à Where : Concat</title>
		<link>https://blog.developpez.com/jerome/p8197/net/11_les_operateurs_de_requete_linq_de_agg</link>
		<comments>https://blog.developpez.com/jerome/p8197/net/11_les_operateurs_de_requete_linq_de_agg#comments</comments>
		<pubDate>Tue, 13 Oct 2009 23:58:04 +0000</pubDate>
		<dc:creator><![CDATA[Jérôme Lambert]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[On entame le milieu de la semaine et pour se motiver un peu plus, rien de tel qu&#8217;un second billet sur les opérateurs Linq et en plus, ça ne va pas être compliqué. L&#8217;opérateur de ce billet est Concat ! Imaginez que vous avez deux listes et que vous désirez n&#8217;en faire qu&#8217;une seule qui regrouperait les éléments de la première liste avec les éléments de la seconde liste : comment procéderiez-vous ? Le facile [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>On entame le milieu de la semaine et pour se motiver un peu plus, rien de tel qu&rsquo;un <a href="http://blog.developpez.com/jerome/p8196/net/10-les-operateurs-de-requete-linq-de-agg/"><strong>second billet sur les opérateurs Linq</strong></a> et en plus, ça ne va pas être compliqué. L&rsquo;opérateur de ce billet est <strong>Concat</strong> !</p>
<p>Imaginez que vous avez deux listes et que vous désirez n&rsquo;en faire qu&rsquo;une seule qui regrouperait les éléments de la première liste avec les éléments de la seconde liste : comment procéderiez-vous ?</p>
<p>Le facile est surement d&rsquo;utiliser la méthode AddRange disponible sur une liste, ainsi vous avez surement pensez à quelque chose de ce genre :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff"><font face=" Courier New"><font size="2"></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> </font></font></font><font color="#000000">listeMembres1 = SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">.GetMembresDeveloppez();          <br /></font><font color="#0000ff"><font face=" Courier New"><font size="2"></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> </font></font></font><font color="#000000">listeMembres2 = SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">.GetMembresDeveloppez();          </p>
<p></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> listeMembreResult = </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000">();          </p>
<p>listeMembreResult.AddRange(listeMembres1);           <br />listeMembreResult.AddRange(listeMembres2);</font></font> </div>
</p></div>
</p>
<p>Grâce à la méthode <strong>Concat</strong> de Linq, vous allez pouvoir concaténer deux listes d&rsquo;objets pour n&rsquo;en faire qu&rsquo;une seule. Je dis liste mais ça fonctionnerait avec n&rsquo;importe quelle collection/séquence tant qu&rsquo;elle implémente <em>IEnumerable</em> ou <em>IEnumerable&lt;T&gt;</em>.</p>
</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> listeMembres1 = SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">.GetMembresDeveloppez();         <br /></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> listeMembres2 = SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">.GetMembresDeveloppez();         </p>
<p></font><font color="#0000ff">var</font><font color="#000000"> query = listeMembres1.Concat(listeMembres2);         </p>
<p></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> listeMembresResult1 = query.ToList();</font></font> </div>
</p></div>
<p>Comme vous pouvez le remarquer, j&rsquo;ai utilisé l&rsquo;opérateur <strong><a href="http://blog.developpez.com/jerome/p8196/net/10-les-operateurs-de-requete-linq-de-agg/">ToList</a></strong> (que nous avons déjà vu lors d&rsquo;un autre billet) après l&rsquo;opérateur <strong>Concat</strong> pour obtenir mes objets dans une liste. La raison est que l&rsquo;opérateur <strong>Concat</strong> renvoie un <em>IEnumerable&lt;T&gt;</em>. En fait pour être plus précis, on récupère un <em>ConcatIterator&lt;T&gt;</em>.</p>
<p><a href="http://blog.developpez.com/media/130/WindowsLiveWriter/9LesoprateursderequteLinqdeAggregateWher_54D/image_2.png"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; margin-left: 0px; border-left-width: 0px; margin-right: 0px" title="image" border="0" alt="image" align="left" src="http://blog.developpez.com/media/130/WindowsLiveWriter/9LesoprateursderequteLinqdeAggregateWher_54D/image_thumb.png" width="565" height="104" /></a> </p>
<p> </p>
<p> </p>
<p> </p>
<p>L&rsquo;opérateur <strong>Concat</strong> ne crée donc pas directement une séquence avec le bon résultat mais va tout simplement s&rsquo;occuper de mémoriser les séquences à concaténer et ce n&rsquo;est qu&rsquo;à la demande que le résultat sera exécuté (par exemple lors d&rsquo;un <strong>foreach</strong> ou comme dans notre cas lors de l&rsquo;utilisation de l&rsquo;opérateur <strong>ToList</strong>. On appelle ça l&rsquo;exécution différée.</p>
<p>Pour le prouver, on va modifier légèrement le code pour ajouter un nouvel élément dans listeMembre1 après avoir créé la requête de concaténation.</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> listeMembres1 = SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">.GetMembresDeveloppez();         <br /></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> listeMembres2 = SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">.GetMembresDeveloppez();         </p>
<p></font><font color="#0000ff">var</font><font color="#000000"> query = listeMembres1.Concat(listeMembres2);         </p>
<p></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> listeMembresResult1 = query.ToList();         </p>
<p>listeMembres1.Add(</font><font color="#0000ff">new</font><font color="#000000"> SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">() { Nom = </font><font color="#a31515">&laquo;&nbsp;Marc Lussac&nbsp;&raquo;</font><font color="#000000">, NombreMessages = 23000 });         </p>
<p></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> listeMembresResult2 = query.ToList();</font></font> </div>
</p></div>
<p>Si vous essayez ce code, vous vous apercevrez que listeMembresResult2 contient un élément de plus que listeMembresResult1.</p>
</p>
<p>Je pense que pour un opérateur dit facile, on est allé assez dans le détail.</p>
<p>Rendez-vous au prochain numéro !</p>
<p> </p>
<p><a href="http://jlambert.developpez.com/sources/LinqOperatorsSolution.zip"><strong><font color="#008000">Téléchargez les sources (sous Visual Studio 2008)</font></strong></a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>#10 Les opérateurs de requête Linq de Aggregate à Where : ToArray &amp; ToList</title>
		<link>https://blog.developpez.com/jerome/p8196/net/10_les_operateurs_de_requete_linq_de_agg</link>
		<comments>https://blog.developpez.com/jerome/p8196/net/10_les_operateurs_de_requete_linq_de_agg#comments</comments>
		<pubDate>Tue, 13 Oct 2009 23:47:28 +0000</pubDate>
		<dc:creator><![CDATA[Jérôme Lambert]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ca y est, nous venons de franchir le 10e billet de la série &#171;&#160;Les opérateurs de requête Linq de Aggregate à Where&#171;&#160;. Je suis assez satisfait de voir que ça avance mais il reste encore pas mal d&#8217;opérateurs à voir ! Ne perdons pas de temps et pour aujourd&#8217;hui, nous allons aborder les opérateurs ToArray &#38; ToList. Prenons le cas de notre liste d&#8217;instances de la classe MembreDeveloppez : List&#60;SampleLibrary.MembreDeveloppez&#62; membres = SampleLibrary.MembreDeveloppez.GetMembresDeveloppez(); Comment feriez-vous [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ca y est, nous venons de franchir le 10e billet de la série &laquo;&nbsp;<em><strong>Les opérateurs de requête Linq de Aggregate à Where</strong></em>&laquo;&nbsp;. Je suis assez satisfait de voir que ça avance mais il reste encore pas mal d&rsquo;opérateurs à voir ! Ne perdons pas de temps et pour aujourd&rsquo;hui, nous allons aborder les opérateurs <strong>ToArray</strong> &amp; <strong>ToList</strong>.</p>
<p>Prenons le cas de notre liste d&rsquo;instances de la classe <em>MembreDeveloppez</em> :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> membres = SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">.GetMembresDeveloppez();</font></font> </div>
</p></div>
</p>
<p>Comment feriez-vous pour transférer vos instances dans un tableau ? (le tableau étant un <em>MembreDeveloppez[]</em>)</p>
<p>Par exemple, vous pourriez avoir pensé à ce code :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">[] membresToArray = </font><font color="#0000ff">new</font><font color="#000000"> SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">[membres.Count];         <br /></font><font color="#0000ff">for</font><font color="#000000"> (</font><font color="#0000ff">int</font><font color="#000000"> i = 0; i &lt; membres.Count; i++)         <br />{          <br />        membresToArray[i] = membres[i];          <br />}</font></font> </div>
</p></div>
<p>Et bien, il y a beaucoup plus simple à présent grâce à l&rsquo;opérateur <strong>ToArray</strong> ! Fini les boucles, une seule ligne de code sera nécessaire :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">[] membresToArray = membres.ToArray();</font></font> </div>
</p></div>
<p>Et le contraire est possible grâce à l&rsquo;opérateur <strong>ToList</strong> qui vous permettra d&rsquo;obtenir une liste typée (dans notre cas nous aurons List&lt;MembreDeveloppez&gt;).</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> membresToList = membresToArray.ToList();</font></font> </div>
</p></div>
<p>A chaque utilisation de <strong>ToArray</strong> ou <strong>ToList</strong>, c&rsquo;est une nouvelle instance de tableau ou de liste typée qui est instanciée et évidemment, les éléments contenus sont les mêmes que dans la séquence source (ce sont donc les mêmes références). Si vous ne m&rsquo;avez pas compris, regardez le bout de code ci-dessous :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#2b91af">List&lt;</font><font color="#000000">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> membres = SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">.GetMembresDeveloppez();</font><font color="#000000">         </p>
<p></font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Est-ce que la liste source est la même que la liste créée avec l&rsquo;opérateur ToList ? {0}&nbsp;&raquo;</font><font color="#000000">, membres == membres.ToList());         <br /></font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Est-ce que le premier élément de la liste source est le même que celui de la liste créée avec l&rsquo;opérateur ToList ? {0}&nbsp;&raquo;</font><font color="#000000">, membres[0] == membres.ToList()[0]);</font></font> </div>
</p></div>
<p>Ce qui donnera à l&rsquo;exécution :</p>
<blockquote><p>Est-ce que la liste source est la même que la liste créée avec l&rsquo;opérateur ToList ? <strong><font color="#ff0000">False</font></strong>      <br />Est-ce que le premier élément de la liste source est le même que celui de la liste créée avec l&rsquo;opérateur ToList ? <strong><font color="#008000">True</font></strong></p>
</blockquote>
<p>Sachez aussi que les opérateurs (comme d&rsquo;ailleurs tous les autres opérateurs Linq) peuvent être utilisés sur n&rsquo;importe quelles collections d&rsquo;objets à condition qu&rsquo;elle implémente l&rsquo;interface <strong>IEnumerable&lt;T&gt;</strong>.</p>
<p>Bon Linq !</p>
<p> </p>
<p><a href="http://jlambert.developpez.com/sources/LinqOperatorsSolution.zip"><strong><font color="#008000">Téléchargez les sources (sous Visual Studio 2008)</font></strong></a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>#8 Les opérateurs de requête Linq de Aggregate à Where : Last &amp; LastOrDefault</title>
		<link>https://blog.developpez.com/jerome/p8158/net/8_les_operateurs_de_requete_linq_de_aggr</link>
		<comments>https://blog.developpez.com/jerome/p8158/net/8_les_operateurs_de_requete_linq_de_aggr#comments</comments>
		<pubDate>Tue, 06 Oct 2009 00:03:05 +0000</pubDate>
		<dc:creator><![CDATA[Jérôme Lambert]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ne dîtes rien, je vous entends déjà dire : &#171;&#160;Oh non, pas encore lui avec son Steve Ballmer qui sera là demain à Paris ! Y en a marre d&#8217;entendre la même musique !!!&#171;&#160;. Et vous avez raison ! Rassurez-vous, ce n&#8217;est pas cette histoire qui va nous empêcher de parler des opérateurs Linq et plus particulièrement des opérateurs Last &#38; LastOrDefault. Vu que c&#8217;est le début de la semaine, je vais faire un petit [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ne dîtes rien, je vous entends déjà dire : &laquo;&nbsp;<em>Oh non, pas encore lui avec son Steve Ballmer qui sera là demain à Paris ! Y en a marre d&rsquo;entendre la même musique !!!</em>&laquo;&nbsp;. Et vous avez raison ! Rassurez-vous, ce n&rsquo;est pas cette histoire qui va nous empêcher de parler des opérateurs Linq et plus particulièrement des opérateurs <strong>Last</strong> &amp; <strong>LastOrDefault</strong>.</p>
<p>Vu que c&rsquo;est le début de la semaine, je vais faire un petit rappel sur notre fameuse classe MembreDeveloppez qui depuis le temps a continuer d&rsquo;évoluer :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">class</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> : </font><font color="#2b91af">IComparable&lt;</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000">         <br />{          <br />        </font><font color="#008000">// &#8230;         <br /></font><font color="#000000">        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">string</font><font color="#000000"> Nom { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font><font color="#000000">; }         <br />        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">int</font><font color="#000000"> NombreMessages { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font><font color="#000000">; }         </p>
<p>        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">int</font><font color="#000000"> CompareTo(</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> other)         <br />        {          <br />                </font><font color="#0000ff">return</font><font color="#000000"> </font><font color="#0000ff">this</font><font color="#000000">.NombreMessages.CompareTo(other.NombreMessages);         <br />        }          <br /></font><font color="#000000">}</font></font> </div>
</p></div>
<p>Vous allez voir que ce nous allons aborder est assez similaire à deux opérateurs que nous avons déjà vu précédemment.</p>
<p>Nous avons toujours une liste d&rsquo;instances de la classe MembreDeveloppez et dîtes-moi comment vous feriez pour récupérer le dernier élément de cette liste ? En sachant qu&rsquo;il est y a au moins un élément dans cette liste.</p>
<p>Un Exemple :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> membre = membres[membres.Count &#8211; 1];</font></font> </div>
</p></div>
<p>Avec l&rsquo;opérateur <strong>Last</strong>, vous allez pouvoir obtenir le même résultat :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> membre1 = membres.Last();</font></font> </div>
</p></div>
<p>A la limite un peu moins de lettres à écrire mais on a déjà vu mieux comme évolution. Par contre, comment feriez-vous pour récupérer dans notre liste le dernier membre de Developpez.com qui a écrit au moins 3000 messages ? </p>
<p>Un cas possible :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> membre = </font><font color="#0000ff">null</font><font color="#000000">;         <br /></font><font color="#0000ff">foreach</font><font color="#000000"> (</font><font color="#0000ff">var</font><font color="#000000"> currentMembre </font><font color="#0000ff">in</font><font color="#000000"> membres)         <br />{          <br />        </font><font color="#0000ff">if</font><font color="#000000"> (currentMembre.NombreMessages >= 3000)         <br />        {          <br />                membre = currentMembre;          <br />        }          <br />}          <br /></font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;{0} est le dernier membre de notre liste qui a écrit au moins 3000 messages.&nbsp;&raquo;</font><font color="#000000">, membre.Nom);</font></font> </div>
</p></div>
<p>Avec l&rsquo;opérateur Last, on va pouvoir le faire en une seule ligne de code !</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> membre2 = membres.Last(membre => membre.NombreMessages >= 3000);</font></font> </div>
</p></div>
<p>Personnellement, c&rsquo;est le style d&rsquo;écriture que j&rsquo;adore : claire et concise. <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<p>Enfin, on va voir une dernière chose car pour rappel, il nous reste encore à illustrer l&rsquo;utilisation de l&rsquo;opérateur <strong>LastOrDefault</strong>. Si on change la contrainte de départ en considérant que notre liste pourrait être vide. Ou bien que la condition ne renvoie aucun résultat. Avec Last, on recevra une exception mais avec LastOrDefault, on récupérera la valeur nulle.</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> membre3 = membres.LastOrDefault(membre => membre.NombreMessages > 100000);</font></font> </div>
</p></div>
<p>C&rsquo;est tout pour aujourd&rsquo;hui !</p>
<p> </p>
<p>J&rsquo;oubliais de vous dire. Dans quelques heures, Steve Ballmer répondra à vos questions lors des Microsoft Days à Paris dès 10h. Et pour ceux qui ne pourront pas être présent à la conférence, l&rsquo;interview sera retransmise <a href="http://msdn.microsoft.com/fr-fr/ee516734.aspx" target="_blank"><strong>en direct via Live Meeting</strong></a> ! <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_smile.gif" alt=":-)" class="wp-smiley" /></p>
<p> </p>
<p><a href="http://jlambert.developpez.com/sources/LinqOperatorsSolution.zip"><strong><font color="#008000">Téléchargez les sources (sous Visual Studio 2008)</font></strong></a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>#7 Les opérateurs de requête Linq de Aggregate à Where : Min &amp; Max</title>
		<link>https://blog.developpez.com/jerome/p8141/net/7_les_operateurs_de_requete_linq_de_aggr</link>
		<comments>https://blog.developpez.com/jerome/p8141/net/7_les_operateurs_de_requete_linq_de_aggr#comments</comments>
		<pubDate>Fri, 02 Oct 2009 00:37:00 +0000</pubDate>
		<dc:creator><![CDATA[Jérôme Lambert]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Et oui ! Je me suis sûrement très bien reposé (trop ?) pendant les vacances et c&#8217;est pour ça que j&#8217;attaque un second billet le même jour ! On va même découvrir deux opérateurs en même temps : Min et Max. Encore et toujours avec la classe MembreDeveloppez, comment feriez-vous pour récupérer le nombre maximum de messages écrits par un membre ? Un exemple : int maxMessages = 0; foreach (var currentMembre in membres) { [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Et oui ! Je me suis sûrement très bien reposé (trop ?) pendant les vacances et c&rsquo;est pour ça que j&rsquo;attaque <a href="http://blog.developpez.com/jerome/p8140/net/6-les-operateurs-de-requete-linq-de-aggr/">un second billet le même jour</a> ! On va même découvrir deux opérateurs en même temps : <strong>Min</strong> et <strong>Max</strong>.</p>
<p>Encore et toujours avec la classe MembreDeveloppez, comment feriez-vous pour récupérer le nombre maximum de messages écrits par un membre ?</p>
<p>Un exemple :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">int</font><font color="#000000"> maxMessages = 0;         <br /></font><font color="#0000ff">foreach</font><font color="#000000"> (</font><font color="#0000ff">var</font><font color="#000000"> currentMembre </font><font color="#0000ff">in</font><font color="#000000"> membres)         <br />{          <br />        </font><font color="#0000ff">if</font><font color="#000000"> (maxMessages &lt; currentMembre.NombreMessages)         <br />        {          <br />                maxMessages = currentMembre.NombreMessages;          <br />        }          <br />}          </p>
<p></font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Nombre maximum de messages écrits : {0}&nbsp;&raquo;</font><font color="#000000">, maxMessages);</font></font> </div>
</p></div>
<p>Avec les opérateurs Linq, on va tout simplement utiliser Max sur notre liste de membres :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">int</font><font color="#000000"> maxMessages = membres.Max(membre => membre.NombreMessages);         </p>
<p></font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Nombre maximum de messages écrits : {0}&nbsp;&raquo;</font><font color="#000000">, maxMessages);</font></font> </div>
</p></div>
<p>Le hic dans la solution avec l&rsquo;opérateur Max, c&rsquo;est qu&rsquo;on n&rsquo;obtient pas le membre de developpez.com qui a écrit le plus de messages. Du moins, ce n&rsquo;est pas possible avec cette surcharge de l&rsquo;opérateur Max. En fait, il est possible de récupérer l&rsquo;instance MembreDeveloppez en utilisant la surcharge de Max sans aucun argument. Evidemment, il faudra implémenter l&rsquo;interface IComparable&lt;T&gt; au niveau du la classe MembreDeveloppez pour que la comparaison puisse se faire correctement.</p>
<p>On aura donc pour la classe MembreDeveloppez :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">class</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> : </font><font color="#2b91af">IComparable</font>&lt;<font color="#2b91af">MembreDeveloppez</font><font color="#000000">&gt;         <br />{          <br />        </font><font color="#008000">// &#8230;         <br /></font><font color="#000000">        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">string</font><font color="#000000"> Nom { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font><font color="#000000">; }         <br />        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">int</font><font color="#000000"> NombreMessages { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font><font color="#000000">; }         </p>
<p>        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">int</font><font color="#000000"> CompareTo(</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> other)         <br />        {          <br />                </font><font color="#0000ff">return</font><font color="#000000"> </font><font color="#0000ff">this</font><font color="#000000">.NombreMessages.CompareTo(other.NombreMessages);         <br />        }          <br /></font><font color="#000000">}</font></font> </div>
</p></div>
<p>Et au final, nous aurons :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2">SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> membreLePlusBavard = membres.Max();         </p>
<p></font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Le membre le plus bavard est {0} avec {1} messages.&nbsp;&raquo;</font><font color="#000000">, membreLePlusBavard.Nom, membreLePlusBavard.NombreMessages);</font></font> </div>
</p></div>
</p>
<p>Et l&rsquo;opérateur <strong>Min</strong> dans tout ça ? J&rsquo;ai honte de montrer un exemple mais par principe, je vais quand même le faire <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /> Donc avec l&rsquo;opérateur, on va tout simplement pouvoir récupérer la valeur minimale dans notre collection comme ceci :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">int</font><font color="#000000"> minMessages = membres.Min(membre => membre.NombreMessages);         </p>
<p></font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Nombre minimum de messages écrits : {0}&nbsp;&raquo;</font><font color="#000000">, minMessages);         </p>
<p>SampleLibrary.</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> membreLePlusDiscret = membres.Min();         </p>
<p></font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Le membre le plus discret est {0} avec {1} messages.&nbsp;&raquo;</font><font color="#000000">, membreLePlusDiscret.Nom, membreLePlusDiscret.NombreMessages);</font></font> </div>
</p></div>
<p>Allez, c&rsquo;est définitivement fini pour aujourd&rsquo;hui !</p>
<p>Et bon week end d&rsquo;avance <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /></p>
<p><a href="http://jlambert.developpez.com/sources/LinqOperatorsSolution.zip"><strong><font color="#008000">Téléchargez les sources (sous Visual Studio 2008)</font></strong></a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>#6 Les opérateurs de requête Linq de Aggregate à Where : Average</title>
		<link>https://blog.developpez.com/jerome/p8140/net/6_les_operateurs_de_requete_linq_de_aggr</link>
		<comments>https://blog.developpez.com/jerome/p8140/net/6_les_operateurs_de_requete_linq_de_aggr#comments</comments>
		<pubDate>Fri, 02 Oct 2009 00:04:34 +0000</pubDate>
		<dc:creator><![CDATA[Jérôme Lambert]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Ca y est, il commence à y avoir un ordre cohérent dans la série des billets sur les opérateurs Linq qui vont suivre. Encore quelques ajustements et ce sera bon. En attendant, on va rester dans la lignée de l&#8217;opérateur Sum que nous avons vu dans le numéro 5 et attaquer l&#8217;opérateur Average. On reprend notre liste d&#8217;instances de la classe MembreDeveloppez et dîtes-moi comment vous feriez-vous pour obtenir la moyenne globale des messages écrits [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ca y est, il commence à y avoir un ordre cohérent dans la série des billets sur les opérateurs Linq qui vont suivre. Encore quelques ajustements et ce sera bon. En attendant, on va rester dans la lignée de l&rsquo;opérateur Sum que nous avons vu <a href="http://blog.developpez.com/jerome/p8129/net/c/5-les-operateurs-de-requete-linq-de-aggr/">dans le numéro 5</a> et attaquer l&rsquo;opérateur <strong>Average</strong>.</p>
<p>On reprend notre liste d&rsquo;instances de la classe MembreDeveloppez et dîtes-moi comment vous feriez-vous pour obtenir la moyenne globale des messages écrits par les membres de developpez.com ?</p>
<p>Facile ?! Je me doute <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">int</font><font color="#000000"> totalMessages = 0;         <br /></font><font color="#0000ff">foreach</font><font color="#000000"> (</font><font color="#0000ff">var</font><font color="#000000"> currentMembre </font><font color="#0000ff">in</font><font color="#000000"> membres)         <br />{          <br />        totalMessages += currentMembre.NombreMessages;          <br />}          </p>
<p></font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Nombre de messages moyen : {0}&nbsp;&raquo;</font><font color="#000000">, (</font><font color="#0000ff">double</font><font color="#000000">)totalMessages / membres.Count);</font></font> </div>
</p></div>
<p>Avec Linq, vous avez un opérateur qui fait tout ça pour vous : <strong>Average</strong>.</p>
<p>Ce qui nous donne :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">double</font><font color="#000000"> moyenneMessage = membres.Average(membre => membre.NombreMessages);         </p>
<p></font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Nombre de messages moyen : {0}&nbsp;&raquo;</font><font color="#000000">, moyenneMessage);         <br /></font><font color="#2b91af">Console</font><font color="#000000">.Read();</font></font> </div>
</p></div>
<p>Et tout comme avec l&rsquo;opérateur Sum, vous pourrez utiliser cet opérateur pour calculer une moyenne avec les types suivants : int, int?, float, float?, decimal, decimal?, double, double?, long et long?.</p>
<p>Bon Linq !</p>
<p><a href="http://jlambert.developpez.com/sources/LinqOperatorsSolution.zip"><strong><font color="#008000">Téléchargez les sources (sous Visual Studio 2008)</font></strong></a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>#5 Les opérateurs de requête Linq de Aggregate à Where : Sum</title>
		<link>https://blog.developpez.com/jerome/p8129/net/5_les_operateurs_de_requete_linq_de_aggr</link>
		<comments>https://blog.developpez.com/jerome/p8129/net/5_les_operateurs_de_requete_linq_de_aggr#comments</comments>
		<pubDate>Tue, 29 Sep 2009 23:55:23 +0000</pubDate>
		<dc:creator><![CDATA[Jérôme Lambert]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Avant de commencer cette série de billets sur Linq, j&#8217;avais décidé d&#8217;aborder les opérateurs dans un ordre aléatoire. Plus, je regarde cet ordre aléatoire et plus je me dis qu&#8217;il va falloir remettre un ordre la dedans car il y a pas mal d&#8217;opérateurs qu&#8217;il n&#8217;est pas possible d&#8217;aborder sans en avoir vu d&#8217;autres au préalable. Enfin soit, aujourd&#8217;hui, on reste dans le facile avec l&#8217;opérateur Sum. On reprend notre classe MembreDeveloppez que voici : [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Avant de commencer cette série de billets sur Linq, j&rsquo;avais décidé d&rsquo;aborder les opérateurs dans un ordre aléatoire. Plus, je regarde cet ordre aléatoire et plus je me dis qu&rsquo;il va falloir remettre un ordre la dedans car il y a pas mal d&rsquo;opérateurs qu&rsquo;il n&rsquo;est pas possible d&rsquo;aborder sans en avoir vu d&rsquo;autres au préalable. Enfin soit, aujourd&rsquo;hui, on reste dans le facile avec l&rsquo;opérateur <strong>Sum</strong>.</p>
<p>On reprend notre classe <strong>MembreDeveloppez</strong> que voici :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">class</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez         <br /></font><font color="#000000">{         <br />        </font><font color="#008000">// &#8230;         <br /></font><font color="#000000">        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">string</font><font color="#000000"> Nom { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font><font color="#000000">; }         <br />        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">int</font><font color="#000000"> NombreMessages { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font><font color="#000000">; }         <br />}</font></font> </div>
</p></div>
<p>Si vous aviez une liste d&rsquo;instances de cette classe, comment feriez-vous pour obtenir le nombre de message écrits par l&rsquo;ensemble des membres de Developpez.com ?</p>
<p>Cette solution par exemple :</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">foreach</font><font color="#000000"> (</font><font color="#0000ff">var</font><font color="#000000"> currentMembre </font><font color="#0000ff">in</font><font color="#000000"> membres)         <br />{          <br />        totalMessage += currentMembre.NombreMessages;          <br />}          </p>
<p></font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Nombre de messages : {0}&nbsp;&raquo;</font><font color="#000000">, totalMessage);</font></font> </div>
</p></div>
<p>Encore une fois, il existe à présent un opérateur qui le fait déjà pour nous : <strong>Sum</strong>.</p>
<p>A présent, stop aux boucles qui font perdre du temps à nous tous, fainéants développeurs que nous sommes.</p>
</p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">int</font><font color="#000000"> totalMessage = membres.Sum(membre => membre.NombreMessages);         </p>
<p></font><font color="#2b91af">Console</font><font color="#000000">.WriteLine(</font><font color="#a31515">&laquo;&nbsp;Nombre de messages : {0}&nbsp;&raquo;</font><font color="#000000">, totalMessage);</font></font> </div>
</p></div>
<p>Vous pourrez d&rsquo;ailleurs utiliser cet opérateur pour calculer une somme avec les types suivants : int, int?, float, float?, decimal, decimal?, double, double?, long et long?.</p>
<p>C&rsquo;est tout pour aujourd&rsquo;hui <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
</p>
<p><a href="http://jlambert.developpez.com/sources/LinqOperatorsSolution.zip"><strong><font color="#008000">Téléchargez les sources (sous Visual Studio 2008)</font></strong></a>.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>#3 Les opérateurs de requête Linq de Aggregate à Where : Reverse</title>
		<link>https://blog.developpez.com/jerome/p7939/net/3_les_operateurs_de_requete_linq_de_aggr</link>
		<comments>https://blog.developpez.com/jerome/p7939/net/3_les_operateurs_de_requete_linq_de_aggr#comments</comments>
		<pubDate>Tue, 11 Aug 2009 00:48:24 +0000</pubDate>
		<dc:creator><![CDATA[Jérôme Lambert]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Si vous cherchiez une logique dans l&#8217;ordre que j&#8217;utilise pour présenter les opérateurs Linq, ne cherchez plus, il n&#8217;y en a aucun (ou presque étant donné que certains opérateurs sont dépendants d&#8217;autres opérateurs). Mais excepté ces quelques exceptions, il ne s&#8217;agit que d&#8217;un bon vieux random pour déterminer l&#8217;ordre dans lequel j&#8217;allais aborder les opérateurs. Maintenant que tout est dit et que l&#8217;on ne cache plus rien du tout, on va passer au sujet principal [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><font size="2" face="Tahoma">Si vous cherchiez une logique dans l&rsquo;ordre que j&rsquo;utilise pour présenter les opérateurs Linq, ne cherchez plus, il n&rsquo;y en a aucun (ou presque étant donné que certains opérateurs sont dépendants d&rsquo;autres opérateurs). Mais excepté ces quelques exceptions, il ne s&rsquo;agit que d&rsquo;un bon vieux random pour déterminer l&rsquo;ordre dans lequel j&rsquo;allais aborder les opérateurs. Maintenant que tout est dit et que l&rsquo;on ne cache plus rien du tout, on va passer au sujet principal qui est l&rsquo;opérateur <strong>Reverse</strong>.</font></p>
<p><font size="2" face="Tahoma">On reprend notre classe MembreDeveloppez qui nous suit depuis le début :</font></p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">class</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez         <br /></font><font color="#000000">{         <br /></font><font color="#000000">        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">string</font><font color="#000000"> Nom { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font><font color="#000000">; }         <br />        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">int</font><font color="#000000"> NombreMessages { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font>; }        <br />}</font> </div>
</p></div>
</p>
<p><font size="2" face="Tahoma">Et maintenant, on va considérer que nous avons toujours une liste d&rsquo;instance de la classe MembreDeveloppez et imaginons que l&rsquo;on désire obtenir une nouvelle liste avec les mêmes éléments mais dans l&rsquo;ordre inverse. Vous pensez de suite à ceci ?</font></p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2">membres.Reverse();</font></font> </div>
</p></div>
<p><font size="2" face="Tahoma">C&rsquo;est faux ! J&rsquo;ai bien demandé une nouvelle instance alors que dans le cas précédent, c&rsquo;est la liste originale qui est altérée <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /> Bon, blague à part, vous avez surement imaginez le code suivant :</font></p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#2b91af">List&lt;</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> membres = GetMembresDeveloppez();         <br /></font><font color="#2b91af">List&lt;</font><font color="#2b91af">MembreDeveloppez&gt;</font><font color="#000000"> membresReverse = </font><font color="#0000ff">new</font><font color="#000000"> </font><font color="#2b91af">List&lt;</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000">&gt;();         </p>
<p></font><font color="#0000ff">for</font><font color="#000000"> (</font><font color="#0000ff">int</font> i = membres.Count; i > 0; i&#8211;)        <br />{        <br />        membresReverse.Add(membres[i &#8211; 1]);        <br />}</font> </div>
</p></div>
<p><font size="2" face="Tahoma">Je vais même vous faire une confidence qui a tout son sens dans le sujet actuel : même si je savais comment inverser les éléments de ma liste, j&rsquo;ai quand même passé 5 minutes à corriger mes erreurs d&rsquo;index pour cet exemple <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /></font></p>
<p><font size="2" face="Tahoma">Tout ça pour dire qu&rsquo;évidemment avec l&rsquo;opérateur <strong>Reverse</strong> de Linq, c&rsquo;est non plus 5 minutes qu&rsquo;il vous faudra mais bien 5 secondes (pour les plus rapides bien sûr).</font></p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">var</font><font color="#000000"> result = membres.Reverse&lt;</font><font color="#2b91af">MembreDeveloppez&gt;</font>();</font> </div>
</p></div>
<p><font size="2" face="Tahoma">Le temps de taper la ligne de code.</font></p>
<p><font size="2" face="Tahoma">Evidemment, j&rsquo;ai un peu tricher car Reverse me renvoie non pas une instance de List&lt;MembreDeveloppez&gt; mais un IEnumerable&lt;MembreDeveloppez&gt;. Un autre opérateur pourrait résoudre ce dernier point mais pour en savoir plus, il vous faudra encore un peu attendre.</font></p>
<p><font size="2" face="Tahoma">A la prochaine <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></font></p>
<p><a href="http://jlambert.developpez.com/sources/LinqOperatorsSolution.zip"><font color="#008000" size="2" face="Tahoma"><strong>Téléchargez les sources (sous Visual Studio 2008)</strong></font></a><font size="2" face="Tahoma">.</font></p>
<p><font size="2" face="Tahoma">A voir aussi :</font></p>
<ul>
<li><a href="http://blog.developpez.com/jerome/p7925/net/1-les-operateurs-de-requete-linq-de-aggr/"><font size="2" face="Tahoma">L&rsquo;opérateur Any</font></a></li>
<li><a href="http://blog.developpez.com/jerome/p7933/net/2-les-operateurs-de-requete-linq-de-aggr/"><font size="2" face="Tahoma">Les opérateurs First &amp; FirstOrDefault</font></a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>#2 Les opérateurs de requête Linq de Aggregate à Where : First &amp; FirstOrDefault</title>
		<link>https://blog.developpez.com/jerome/p7933/net/2_les_operateurs_de_requete_linq_de_aggr</link>
		<comments>https://blog.developpez.com/jerome/p7933/net/2_les_operateurs_de_requete_linq_de_aggr#comments</comments>
		<pubDate>Fri, 07 Aug 2009 00:48:15 +0000</pubDate>
		<dc:creator><![CDATA[Jérôme Lambert]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Linq]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Nous voila pour le second billet sur les opérateurs Linq et pour aujourd&#8217;hui, j&#8217;aimerais aborder deux opérateurs qui se ressemblent fort : First &#38; FirstOrDefault. Pour l&#8217;occasion, j&#8217;en ai profité pour créer une solution Visual Studio 2008 qui sera mise à jour après chaque billet. Vous retrouverez le zip de la solution en fin d&#8217;article. On va reprendre notre &#171;&#160;classe&#160;&#187; MembreDeveloppez que j&#8217;ai un peu étoffé pour l&#8217;occasion : public class MembreDeveloppez {         public string Nom { [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><font size="2" face="Tahoma">Nous voila pour le second billet sur les opérateurs Linq et pour aujourd&rsquo;hui, j&rsquo;aimerais aborder deux opérateurs qui se ressemblent fort : <strong>First</strong> &amp; <strong>FirstOrDefault</strong>. Pour l&rsquo;occasion, j&rsquo;en ai profité pour créer une solution Visual Studio 2008 qui sera mise à jour après chaque billet. Vous retrouverez le zip de la solution en fin d&rsquo;article.</font></p>
<p><font size="2" face="Tahoma">On va reprendre notre &laquo;&nbsp;classe&nbsp;&raquo; MembreDeveloppez que j&rsquo;ai un peu étoffé pour l&rsquo;occasion :</font></p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">class</font><font color="#000000"> </font><font color="#2b91af">MembreDeveloppez         <br /></font><font color="#000000">{         <br />        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">string</font><font color="#000000"> Nom { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font><font color="#000000">; }         <br />        </font><font color="#0000ff">public</font><font color="#000000"> </font><font color="#0000ff">int</font><font color="#000000"> NombreMessages { </font><font color="#0000ff">get</font><font color="#000000">; </font><font color="#0000ff">set</font><font color="#000000">; }         <br />}</font></font> </div>
</p></div>
<p><font size="2" face="Tahoma">Et toujours sur le même principe qu&rsquo;avant, on va considérer que nous avons une liste d&rsquo;instances de la classe MembreDeveloppez (donc &lt;ListMembreDeveloppez&gt;).</font></p>
<p><font size="2" face="Tahoma">Alors maintenant, dîtes-moi comment vous feriez pour récupérer le premier élément de cette liste en sachant qu&rsquo;il y a au moins un élément dedans ?</font></p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#2b91af">MembreDeveloppez</font> membre1 = membres[0];</font> </div>
</p></div>
</p>
<p><font size="2" face="Tahoma">Vous avez pensé à ça ? Pas mal. Personnellement, je fais comme ceci avec l&rsquo;opérateur <strong>First</strong> de Linq :</font></p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#2b91af">MembreDeveloppez</font> membre1 = membres.First();</font> </div>
</p></div>
</p>
<p><font size="2" face="Tahoma">Impressionnant, n&rsquo;est-ce pas ?! Non ??? Admettons, un point pour vous, on peut dire que cet opérateur n&rsquo;apporte pas grand chose dans notre cas. Cependant, je me demande bien comment vous faîtes pour récupérer le premier objet dans la liste qui a un nombre de message supérieur à 2000 ?</font></p>
<p><font size="2" face="Tahoma">Pour la majorité d&rsquo;entre vous, vous feriez comme ceci ?</font></p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#0000ff">foreach</font><font color="#000000"> (</font><font color="#2b91af">MembreDeveloppez</font><font color="#000000"> membre </font><font color="#0000ff">in</font><font color="#000000"> membres)         <br />{          <br />        </font><font color="#0000ff">if</font><font color="#000000"> (membre.NombreMessages &gt; 2000)         <br />        {          <br />                </font><font color="#008000">// Trouvé !         <br /></font>        }        <br />}</font> </div>
</p></div>
<p><font size="2" face="Tahoma">Dans ce cas-ci et toujours avec l&rsquo;opérateur First, une ligne de code !</font></p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#2b91af">MembreDeveloppez</font> membre1 = membres.First(membre =&gt; membre.NombreMessages &gt; 2000);</font> </div>
</p></div>
<p><font size="2" face="Tahoma">Aaaahhh, c&rsquo;est mieux quand même ! Et si on corsait légèrement l&rsquo;énoncé en disant qu&rsquo;il est possible que notre liste n&rsquo;ait aucun élément. Pour vous, on va dire que ça ne change rien mais dans le cas de l&rsquo;opérateur First, on risque de recevoir une exception si notre liste est vide ou bien si la condition n&rsquo;est pas respectée. C&rsquo;est là que l&rsquo;opérateur <strong>FirstOrDefault</strong> va s&rsquo;avérer utile car dans le cas où notre demande ne renvoie rien, on ne recevra pas une exception comme avec First mais tout simplement <strong>null</strong>.</font></p>
<div style="border-bottom: #000000 1px solid; border-left: #000000 1px solid; margin-left: 10pt; border-top: #000000 1px solid; margin-right: 2pt; border-right: #000000 1px solid">
<div style="background-color: #dcdcdc; white-space: nowrap; overflow: scroll"><font face=" Courier New"><font size="2"></font><font color="#2b91af">MembreDeveloppez</font> membre2 = membres.FirstOrDefault(membre =&gt; membre.NombreMessages &gt; 100000);</font> </div>
</p></div>
<p><font size="2" face="Tahoma">On va s&rsquo;arrêter là pour aujourd&rsquo;hui, Bon Linq <img src="https://blog.developpez.com/jerome/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" />     <br /></font></p>
<p><a href="http://jlambert.developpez.com/sources/LinqOperatorsSolution.zip"><font color="#008000" size="2" face="Tahoma"><strong>Téléchargez les sources (sous Visual Studio 2008)</strong></font></a><font size="2" face="Tahoma">.</font></p>
<p><font size="2"><font face="Tahoma"><u>A voir aussi</u> :</font></font></p>
<ul>
<li><a href="http://blog.developpez.com/jerome/p7925/net/1-les-operateurs-de-requete-linq-de-aggr/"><font size="2" face="Tahoma">L&rsquo;opérateur Any</font></a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
	</channel>
</rss>
