<?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>Blog de Matthieu MEZIL</title>
	<atom:link href="https://blog.developpez.com/matthieu/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/matthieu</link>
	<description></description>
	<lastBuildDate>Fri, 14 Dec 2007 21:05:16 +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>Article .NET 3.5</title>
		<link>https://blog.developpez.com/matthieu/p4683/net/article_net_3_5</link>
		<comments>https://blog.developpez.com/matthieu/p4683/net/article_net_3_5#comments</comments>
		<pubDate>Fri, 14 Dec 2007 21:05:16 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Vous trouverez dans le hors série .net de Programmez un article &#171;&#160;Plongée au coeur de .Net 3.5&#8243; co-écrit avec Michel Perfetti. Bonne lecture]]></description>
				<content:encoded><![CDATA[<p>Vous trouverez dans le hors série .net de Programmez un article &laquo;&nbsp;Plongée au coeur de .Net 3.5&Prime; co-écrit avec <a href="http://blogs.codes-sources.com/miiitch/">Michel Perfetti</a>.<br />
Bonne lecture <img src="https://blog.developpez.com/matthieu/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C# 3.0 Créer une liste de types anonymes</title>
		<link>https://blog.developpez.com/matthieu/p3153/net/c_3_0_creer_une_liste_de_types_anonymes</link>
		<comments>https://blog.developpez.com/matthieu/p3153/net/c_3_0_creer_une_liste_de_types_anonymes#comments</comments>
		<pubDate>Sat, 31 Mar 2007 22:18:02 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans mon article sur le C# 3.0, j&#8217;avais regretté le fait de ne pouvoir créer de list de type anonyme. Cependant, en me repenchant sur le sujet, j&#8217;ai trouvé une feinte : var test = new { PropertyStr = &#34;un&#34;, PropertyInt = 1 }; var list = Activator.CreateInstance(Type.GetType(&#34;System.Collections.Generic.List`1[&#34; + test.GetType().ToString() + &#34;]&#34;)) as IList; list.Add(test); list.Add(new { PropertyStr = &#34;deux&#34;, PropertyInt = 2 }); Ensuite, pour récupérer la valeur des propriétés de notre anonymous type [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Dans <a href="http://matthieumezil.developpez.com/tutoriels/dotnet/CSharp3/index.php">mon article sur le C# 3.0</a>, j&rsquo;avais regretté le fait de ne pouvoir créer de list de type anonyme.<br />
Cependant, en me repenchant sur le sujet, j&rsquo;ai trouvé une feinte :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var test = new { PropertyStr = &quot;un&quot;, PropertyInt = 1 }; <br />
var list = Activator.CreateInstance(Type.GetType(&quot;System.Collections.Generic.List`1[&quot; + test.GetType().ToString() + &quot;]&quot;)) as IList; <br />
list.Add(test); <br />
list.Add(new { PropertyStr = &quot;deux&quot;, PropertyInt = 2 });</div></div>
<p>Ensuite, pour récupérer la valeur des propriétés de notre anonymous type pour les éléments de la liste, on peut utiliser la reflection ou alors il faut encore feinter <img src="https://blog.developpez.com/matthieu/wp-includes/images/smilies/icon_wink.gif" alt=";-)" class="wp-smiley" /> :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">static void Main(string[] args) <br />
{ <br />
&nbsp; var test = new { PropertyStr = &quot;un&quot;, PropertyInt = 1 }; <br />
&nbsp; var list = Activator.CreateInstance(Type.GetType(&quot;System.Collections.Generic.List`1[&quot; + test.GetType().ToString() + &quot;]&quot;)) as IList; <br />
&nbsp; list.Add(test); <br />
&nbsp; list.Add(new { PropertyStr = &quot;deux&quot;, PropertyInt = 2 }); <br />
&nbsp;<br />
&nbsp; foreach (object o in list) <br />
&nbsp; { <br />
&nbsp; &nbsp;var v = Cast(test, o); <br />
&nbsp; &nbsp;Console.WriteLine(v.PropertyInt.ToString() + &quot; &quot; + v.PropertyStr); <br />
&nbsp; } <br />
&nbsp; Console.ReadLine(); <br />
} <br />
&nbsp;<br />
public static T Cast&lt;T&gt;(T typedValue, object value) <br />
{ <br />
&nbsp; return (T)value; <br />
}</div></div>
<p>J&rsquo;espère cependant toujours que l&rsquo;on puisse créer des listes de type anonyme dans la version finale. Le code pourrait alors ressemblait à ça :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">var list = new List&lt;{ string PropertyStr, int PropertyInt }&gt;(); <br />
list.Add(new { PropertyStr = &quot;un&quot;, PropertyInt = 1 }); <br />
list.Add(new { PropertyStr = &quot;deux&quot;, PropertyInt = 2 }); <br />
foreach ({ string PropertyStr, int PropertyInt } o in list) <br />
&nbsp; Console.WriteLine(o.PropertyInt.ToString() + &quot; &quot; + o.PropertyStr);</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>VS 2008 dispo sur msdn !!!</title>
		<link>https://blog.developpez.com/matthieu/p4548/tools/vs_2008_dispo_sur_msdn</link>
		<comments>https://blog.developpez.com/matthieu/p4548/tools/vs_2008_dispo_sur_msdn#comments</comments>
		<pubDate>Mon, 19 Nov 2007 10:07:36 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[L&#8217;info est énorme !!! VS 2008 est dispo dès à présent. Il faut juste avoir un compte msdn pour cela. Bon téléchargement]]></description>
				<content:encoded><![CDATA[<p>L&rsquo;info est énorme !!!<br />
VS 2008 est dispo dès à présent. Il faut juste avoir un compte msdn pour cela.<br />
Bon téléchargement <img src="https://blog.developpez.com/matthieu/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Rename incomplete</title>
		<link>https://blog.developpez.com/matthieu/p4521/net/rename_incomplete</link>
		<comments>https://blog.developpez.com/matthieu/p4521/net/rename_incomplete#comments</comments>
		<pubDate>Tue, 13 Nov 2007 19:34:12 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Imaginons le code suivant : int i = 0; #if DEBUG i ++; #else i--; #endif Si je renomme i en j et que je laisse VS le renommer pour moi, j&#8217;obtiens le code suivant : int j = 0; #if DEBUG j ++; #else i--; #endif Je comprends bien la difficulté évoquée par Michael Taylor sur le forum msdn mais je trouve que c&#8217;est regrettable.]]></description>
				<content:encoded><![CDATA[<p>Imaginons le code suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int i = 0; <br />
#if DEBUG <br />
i ++; <br />
#else <br />
i--; <br />
#endif</div></div>
<p>Si je renomme i en j et que je laisse VS le renommer pour moi, j&rsquo;obtiens le code suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">int j = 0; <br />
#if DEBUG <br />
j ++; <br />
#else <br />
i--; <br />
#endif</div></div>
<p>Je comprends bien la difficulté évoquée par <a href="http://p3net.mvps.org/">Michael Taylor</a> <a href="http://forums.microsoft.com/MSDN/showpost.aspx?postid=2402019&amp;siteid=1&amp;&amp;notification_id=136157&amp;message_id=136157&amp;agent=messenger">sur le forum msdn </a> mais je trouve que c&rsquo;est regrettable.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MIX 2008</title>
		<link>https://blog.developpez.com/matthieu/p4503/ms/mix_2008</link>
		<comments>https://blog.developpez.com/matthieu/p4503/ms/mix_2008#comments</comments>
		<pubDate>Thu, 08 Nov 2007 23:24:53 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[ASP .NET]]></category>
		<category><![CDATA[MS]]></category>
		<category><![CDATA[Silverlight]]></category>
		<category><![CDATA[WPF]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Les inscriptions pour le MIX 2008 sont ouvertes. Pour rappel, le MIX, c&#8217;est L&#8216;évènement web MS annuel. Comme chaque année, il se fera à Las Vegas et sera ensuite relayé dans le monde entier (au cirque d&#8217;hiver de Paris l&#8217;année dernière par ex). Cette année, il aura lieu du 5 au 7 mars 2008 au Resort Hotel Casino, Las Vegas, Nevada.]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.visitmix.com/2008/index.html">Les inscriptions pour le MIX 2008 sont ouvertes</a>.<br />
Pour rappel, le MIX, c&rsquo;est <b>L</b>&lsquo;évènement web MS annuel. Comme chaque année, il se fera à Las Vegas et sera ensuite relayé dans le monde entier (au cirque d&rsquo;hiver de Paris l&rsquo;année dernière par ex). Cette année, il aura lieu du 5 au 7 mars 2008 au Resort Hotel Casino, Las Vegas, Nevada.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>VB et les Optional</title>
		<link>https://blog.developpez.com/matthieu/p4504/net/vb_et_les_optional</link>
		<comments>https://blog.developpez.com/matthieu/p4504/net/vb_et_les_optional#comments</comments>
		<pubDate>Thu, 08 Nov 2007 07:09:56 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Les paramètres optional ne peuvent pas être de type structure. Par conséquent, les nullables ne sont pas autorisés]]></description>
				<content:encoded><![CDATA[<p>Les paramètres optional ne peuvent pas être de type structure. Par conséquent, les nullables ne sont pas autorisés <img src="https://blog.developpez.com/matthieu/wp-includes/images/smilies/icon_sad.gif" alt=":(" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LINQ Select VB != Select C# quand on fait un select sur un type anonyme</title>
		<link>https://blog.developpez.com/matthieu/p4379/net/linq_select_vb_select_c_quand_on_fait_un</link>
		<comments>https://blog.developpez.com/matthieu/p4379/net/linq_select_vb_select_c_quand_on_fait_un#comments</comments>
		<pubDate>Sat, 13 Oct 2007 07:48:10 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Imaginons une classe Personne avec plusieurs propriétés telles que le Nom, Prenom, DateNaissance, Adresse, etc. Pour créer un type anonyme en C#, il suffit de faire : new { Nom = p.Nom, Prenom = p.Prenom } Dans ce cas, les noms des propriétés étant les mêmes, on pourra même directement écrire : new { p.Nom, p.Prenom } De la même manière, en VB, il suffit d&#8217;écrire New With { p.Nom, p.Prenom } Si vous voulez [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Imaginons une classe Personne avec plusieurs propriétés telles que le Nom, Prenom, DateNaissance, Adresse, etc.</p>
<p>Pour créer un type anonyme en C#, il suffit de faire :</p>
<p><code class="codecolorer text default"><span class="text">new { Nom = p.Nom, Prenom = p.Prenom }</span></code></p>
<p>Dans ce cas, les noms des propriétés étant les mêmes, on pourra même directement écrire : </p>
<p><code class="codecolorer text default"><span class="text">new { p.Nom, p.Prenom }</span></code></p>
<p>De la même manière, en VB, il suffit d&rsquo;écrire</p>
<p><code class="codecolorer text default"><span class="text">New With { p.Nom, p.Prenom }</span></code></p>
<p>Si vous voulez faire une requête LINQ et ne renvoyer que le nom et le prénom, il faut utiliser un type anonyme.</p>
<p>Fort logiquement, en C#, il faut faire : </p>
<p><code class="codecolorer text default"><span class="text">from p in persons select new {p.Nom, p.Prenom}</span></code></p>
<p>En VB, le type anonyme va être créé pour nous avec l&rsquo;écriture suivante (plus proche du SQL) : </p>
<p><code class="codecolorer text default"><span class="text">from p in persons select p.Nom, p.Prenom</span></code></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>LINQ : attention à bien l&#8217;utiliser</title>
		<link>https://blog.developpez.com/matthieu/p4477/net/linq_attention_a_bien_l_utiliser</link>
		<comments>https://blog.developpez.com/matthieu/p4477/net/linq_attention_a_bien_l_utiliser#comments</comments>
		<pubDate>Sat, 03 Nov 2007 20:42:55 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Le défaut de LINQ c&#8217;est qu&#8217;il va devenir beaucoup plus facile de faire du code moins performant. Prenons un exemple : public class Client { &#160; private List&#60;Facture&#62; _factures; &#160; &#160; public string Nom { get; set; } &#160; public string Prenom { get; set; } &#160; public List&#60;Facture&#62; Factures &#160; { &#160; &#160; get &#160; &#160; { &#160; &#160; &#160; if (_factures == null) &#160; &#160; &#160; &#160; _factures = new List&#60;Facture&#62;(); &#160; &#160; [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Le défaut de LINQ c&rsquo;est qu&rsquo;il va devenir beaucoup plus facile de faire du code moins performant.<br />
Prenons un exemple :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">public class Client <br />
{ <br />
&nbsp; private List&lt;Facture&gt; _factures; <br />
&nbsp;<br />
&nbsp; public string Nom { get; set; } <br />
&nbsp; public string Prenom { get; set; } <br />
&nbsp; public List&lt;Facture&gt; Factures <br />
&nbsp; { <br />
&nbsp; &nbsp; get <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; if (_factures == null) <br />
&nbsp; &nbsp; &nbsp; &nbsp; _factures = new List&lt;Facture&gt;(); <br />
&nbsp; &nbsp; &nbsp; return _factures; <br />
&nbsp; &nbsp; } <br />
&nbsp; } <br />
} <br />
&nbsp;<br />
public class Facture <br />
{ <br />
&nbsp; private Client _client; <br />
&nbsp;<br />
&nbsp; public Client Client <br />
&nbsp; { <br />
&nbsp; &nbsp; get { return _client; } <br />
&nbsp; &nbsp; set <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; if (_client != null) <br />
&nbsp; &nbsp; &nbsp; &nbsp; _client.Factures.Remove(this); <br />
&nbsp; &nbsp; &nbsp; _client = value; <br />
&nbsp; &nbsp; &nbsp; _client.Factures.Add(this); <br />
&nbsp; &nbsp; } <br />
&nbsp; } <br />
&nbsp; public decimal Prix { get; set; } <br />
}</div></div>
<p>Imaginons que l&rsquo;on veuille récupérer les clients ayant dépensé au moins 50 euros en les triant par ordre décroissant de dépense, puis alphabétiquement.</p>
<p>Le code en C# 2.0 pourrait être le suivant :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:300px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">List&lt;Client&gt; copyClients = new List&lt;Client&gt;(); <br />
copyClients.AddRange(clients); <br />
&nbsp;<br />
copyClients.Sort(delegate(Client x, Client y) <br />
{ <br />
&nbsp; decimal xFacturesSomme = 0, yFacturesSomme = 0; <br />
&nbsp; foreach (Facture facture in x.Factures) <br />
&nbsp; &nbsp; xFacturesSomme += facture.Prix; <br />
&nbsp; foreach (Facture facture in y.Factures) <br />
&nbsp; &nbsp; yFacturesSomme += facture.Prix; <br />
&nbsp; int compareFactureSomme = xFacturesSomme.CompareTo(yFacturesSomme); <br />
&nbsp; if (compareFactureSomme != 0) <br />
&nbsp; &nbsp; return -compareFactureSomme; <br />
&nbsp; int compareNom = x.Nom.CompareTo(y.Nom); <br />
&nbsp; if (compareNom != 0) <br />
&nbsp; &nbsp; return compareNom; <br />
&nbsp; return x.Prenom.CompareTo(y.Prenom); <br />
}); <br />
foreach (Client c in copyClients) <br />
{ <br />
&nbsp; decimal facturesSomme = 0; <br />
&nbsp; foreach (Facture facture in c.Factures) <br />
&nbsp; &nbsp; facturesSomme += facture.Prix; <br />
&nbsp; if (facturesSomme &gt; 50) <br />
&nbsp; &nbsp; Console.WriteLine(&quot;{0} {1} a dépensé {2} euros&quot;, c.Nom, c.Prenom, facturesSomme); <br />
}</div></div>
<p>Avec LINQ, ce code peut être grandement simplifié. Mais attention, on pourrait écrire ceci :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">foreach (var statClient in from c in <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(from client in clients <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select new <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.Nom, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.Prenom, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TotalDepense = (from f in client.Factures <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select f.Prix).Sum() <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;where c.TotalDepense &gt; 50 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;orderby c.TotalDepense descending, c.Nom, c.Prenom <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;select c) <br />
&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(&quot;{0} {1} a dépensé {2} euros&quot;, statClient.Nom, statClient.Prenom, statClient.TotalDepense);</div></div>
<p>Cependant, analysons de plus près ce code : </p>
<p>Pour calculer la somme totale dépensée par le client, nous parcourons toutes les factures pour récupérer un IEnumerable sur le prix de celles-ci, puis nous reparcourons cet IEnumerable pour faire la somme.</p>
<p>L&rsquo;idée serait donc de regrouper ces deux boucles en une seule. Pour cela, utilisons une lambda expression et une autre signature de la méthode Sum :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">foreach (var statClient in from c in <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;(from client in clients <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; select new <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.Nom, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.Prenom, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TotalDepense = client.Factures.Sum(f =&gt; f.Prix) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;where c.TotalDepense &gt; 50 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;orderby c.TotalDepense descending, c.Nom, c.Prenom <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;select c) <br />
&nbsp; Console.WriteLine(&quot;{0} {1} a dépensé {2} euros&quot;, statClient.Nom, statClient.Prenom, statClient.TotalDepense);</div></div>
<p>L&rsquo;autre problème que l&rsquo;on peut identifier, c&rsquo;est le fait que nous parcourons une première boucle sur les clients pour récupérer un IEnumerable de type anonyme avec le nom, le prénom et la somme dépensée et qu&rsquo;ensuite, nous reparcourons cet IEnumerable pour les trier. Effectivement, pour pouvoir trier par la somme dépensée, il faut au préalable l&rsquo;avoir calculée.</p>
<p>Là encore, une meilleure utilisation de LINQ pourrait nous permettre d&rsquo;optimiser cela :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">foreach (var statClient in from c in clients <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;let totalDepense = c.Factures.Sum(f =&gt; f.Prix) <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;where totalDepense &gt; 50 <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;orderby totalDepense descending, c.Nom, c.Prenom <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;select new <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{ <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c.Nom, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c.Prenom, <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;TotalDepense = totalDepense <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}) <br />
&nbsp; Console.WriteLine(&quot;{0} {1} a dépensé {2} euros&quot;, statClient.Nom, statClient.Prenom, statClient.TotalDepense);</div></div>
<p>Via ce post, je cherche à démontrer deux choses :<br />
<b>la requête LINQ est beaucoup plus simple et claire que le code C# 2.0.<br />
une mauvaise connaissance de LINQ peut engendrer des pertes de performances importantes.</b></p>
<p>En revanche, avec LINQ To SQL, même si je ne vous conseille bien entendu pas d&rsquo;écrire de &laquo;&nbsp;mauvaises&nbsp;&raquo; requêtes, la requête SQL générée est optimisée. Dans les trois cas précédents, la requête sera la suivante :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">SELECT [t2].[Nom], [t2].[Prenom], [t2].[value] AS [TotalDepense] <br />
FROM ( <br />
&nbsp; SELECT [t0].[Nom], [t0].[Prenom], ( <br />
&nbsp; &nbsp; SELECT SUM([t1].[Prix]) <br />
&nbsp; &nbsp; FROM [dbo].[Facture] AS [t1] <br />
&nbsp; &nbsp; WHERE [t1].[Client] = [t0].[Id] <br />
&nbsp; ) AS [value] <br />
&nbsp; FROM [dbo].[Client] AS [t0] <br />
&nbsp; ) AS [t2] <br />
WHERE [t2].[value] &gt; @p0 <br />
ORDER BY [t2].[value] DESC, [t2].[Nom], [t2].[Prenom]</div></div>
<p>Le risque lié à une mauvaise connaissance de LINQ peut cependant être fortement réduit avec une formation (<a href="http://www.winwise.fr/formation/Presentation-de-LINQ-W095.aspx">http://www.winwise.fr/formation/Presentation-de-LINQ-W095.aspx</a> par exemple).</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Extension method : C# différent de VB</title>
		<link>https://blog.developpez.com/matthieu/p4493/net/extension_method_c_diff_vb</link>
		<comments>https://blog.developpez.com/matthieu/p4493/net/extension_method_c_diff_vb#comments</comments>
		<pubDate>Wed, 07 Nov 2007 07:05:51 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans l&#8217;excellent article de Adrian &#171;&#160;Spotty&#160;&#187; Bowles paru dans le msdn mag sur les extension methods en VB, l&#8217;auteur nous explique que ce code : Imports System.Runtime.CompilerServices &#160; &#160; Module Module1 &#160; &#160; Sub Main() &#160; &#160; &#160; &#160; Dim s As Integer = 1234 &#160; &#160; &#160; &#160; Console.WriteLine(s.Foo) '&#60;- This will work &#160; &#160; &#160; &#160; &#160; Dim T As Object &#160; &#160; &#160; &#160; T = 1234 &#160; &#160; &#160; &#160; Console.WriteLine(T.Foo) [&#8230;]]]></description>
				<content:encoded><![CDATA[<p><a href="http://msdn.microsoft.com/msdnmag/issues/07/11/BasicInstincts/">Dans l&rsquo;excellent article de Adrian &laquo;&nbsp;Spotty&nbsp;&raquo; Bowles paru dans le msdn mag sur les extension methods en VB</a>, l&rsquo;auteur nous explique que ce code :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Imports System.Runtime.CompilerServices &nbsp;<br />
&nbsp;<br />
Module Module1 <br />
&nbsp; &nbsp; Sub Main() <br />
&nbsp; &nbsp; &nbsp; &nbsp; Dim s As Integer = 1234 <br />
&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(s.Foo) '&lt;- This will work <br />
&nbsp;<br />
&nbsp; &nbsp; &nbsp; &nbsp; Dim T As Object <br />
&nbsp; &nbsp; &nbsp; &nbsp; T = 1234 <br />
&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(T.Foo) &nbsp;'&lt;- This will fail <br />
&nbsp; &nbsp; End Sub <br />
End Module <br />
&nbsp;<br />
Module Extensions01 <br />
&nbsp; &nbsp; &lt;Extension()&gt; _ <br />
&nbsp; &nbsp; Function Foo(ByVal b As Object) As String <br />
&nbsp; &nbsp; &nbsp; &nbsp; Return &quot;Bar01&quot; <br />
&nbsp; &nbsp; End Function <br />
End Module</div></div>
<p>génère une exception à la compilation et c&rsquo;est vrai !</p>
<p>Mais pas en C#. </p>
<p>Le code suivant marche en effet très bien :</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class Program <br />
{ <br />
&nbsp; &nbsp; static void Main(string[] args) <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; object o; <br />
&nbsp; &nbsp; &nbsp; &nbsp; o = 10; <br />
&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(o.Foo()); <br />
&nbsp; &nbsp; &nbsp; &nbsp; Console.ReadLine(); <br />
&nbsp; &nbsp; } <br />
} <br />
&nbsp;<br />
static class Ext <br />
{ <br />
&nbsp; &nbsp; public static string Foo(this object o) <br />
&nbsp; &nbsp; { <br />
&nbsp; &nbsp; &nbsp; &nbsp; return &quot;test&quot;; <br />
&nbsp; &nbsp; } <br />
}</div></div>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VS 2008 sortie fin novembre</title>
		<link>https://blog.developpez.com/matthieu/p4487/tools/vs_2008_sortie_fin_novembre</link>
		<comments>https://blog.developpez.com/matthieu/p4487/tools/vs_2008_sortie_fin_novembre#comments</comments>
		<pubDate>Mon, 05 Nov 2007 22:33:25 +0000</pubDate>
		<dc:creator><![CDATA[Matthieu MEZIL]]></dc:creator>
				<category><![CDATA[.Net]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Tools]]></category>
		<category><![CDATA[VB]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[C&#8217;est officiel, VS 2008 sortira fin novembre. Que du bonheur en perspective]]></description>
				<content:encoded><![CDATA[<p><a href="http://blogs.msdn.com/somasegar/archive/2007/11/05/teched-developer-in-europe.aspx">C&rsquo;est officiel, VS 2008 sortira fin novembre</a>. Que du bonheur en perspective <img src="https://blog.developpez.com/matthieu/wp-includes/images/smilies/icon_smile.gif" alt=":)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
