[{"data":1,"prerenderedAt":1293},["ShallowReactive",2],{"page-\u002Fcsharp\u002Flinq-et-async":3,"pieces-csharp":1251,"autour-\u002Fcsharp\u002Flinq-et-async":1276,"prerequis-\u002Fcsharp\u002Flinq-et-async":1280,"plan-csharp":1282},{"id":4,"title":5,"body":6,"description":1219,"extension":1220,"ligne":65,"meta":1221,"motsCles":1222,"navigation":118,"niveau":1224,"path":1225,"prerequis":1226,"ressources":1228,"seo":1240,"sources":1241,"stem":1249,"__hash__":1250},"docs\u002Fcsharp\u002F06.linq-et-async.md","LINQ et async\u002Fawait",{"type":7,"value":8,"toc":1207},"minimark",[9,14,52,56,60,251,267,271,274,359,379,383,391,458,468,477,486,490,493,586,591,691,697,775,779,786,789,808,812,933,948,953,957,964,1022,1036,1054,1058,1064,1141,1144,1148,1203],[10,11,13],"h2",{"id":12},"ce-que-tu-vas-apprendre","Ce que tu vas apprendre",[15,16,17,37,40],"ul",{},[18,19,20,21,25,26,25,29,32,33,36],"li",{},"Interroger une collection avec ",[22,23,24],"code",{},"Where",", ",[22,27,28],{},"Select",[22,30,31],{},"OrderBy"," et ",[22,34,35],{},"GroupBy",".",[18,38,39],{},"Lire et écrire une expression lambda.",[18,41,42,43,25,46,32,49,36],{},"Écrire une méthode asynchrone avec ",[22,44,45],{},"async",[22,47,48],{},"await",[22,50,51],{},"Task",[10,53,55],{"id":54},"le-point-de-départ","Le point de départ",[57,58,59],"p",{},"Pour les exemples de ce chapitre, utilise une liste de recettes sous forme de record :",[61,62,67],"pre",{"className":63,"code":64,"language":65,"meta":66,"style":66},"language-csharp shiki shiki-themes github-light-default github-dark-default github-dark-default","public record Recette(string Nom, string Categorie, int Minutes);\n\nvar recettes = new List\u003CRecette>\n{\n    new(\"Crêpes\", \"dessert\", 30),\n    new(\"Soupe\", \"plat\", 45),\n    new(\"Salade\", \"entree\", 10),\n    new(\"Tarte\", \"dessert\", 60)\n};\n","csharp","",[22,68,69,113,120,147,153,179,201,223,245],{"__ignoreMap":66},[70,71,74,78,81,85,89,92,95,97,99,102,104,107,110],"span",{"class":72,"line":73},"line",1,[70,75,77],{"class":76},"sOnC1","public",[70,79,80],{"class":76}," record",[70,82,84],{"class":83},"sIXEE"," Recette",[70,86,88],{"class":87},"scfrF","(",[70,90,91],{"class":76},"string",[70,93,94],{"class":83}," Nom",[70,96,25],{"class":87},[70,98,91],{"class":76},[70,100,101],{"class":83}," Categorie",[70,103,25],{"class":87},[70,105,106],{"class":76},"int",[70,108,109],{"class":83}," Minutes",[70,111,112],{"class":87},");\n",[70,114,116],{"class":72,"line":115},2,[70,117,119],{"emptyLinePlaceholder":118},true,"\n",[70,121,123,126,129,132,135,138,141,144],{"class":72,"line":122},3,[70,124,125],{"class":76},"var",[70,127,128],{"class":83}," recettes",[70,130,131],{"class":76}," =",[70,133,134],{"class":76}," new",[70,136,137],{"class":83}," List",[70,139,140],{"class":87},"\u003C",[70,142,143],{"class":83},"Recette",[70,145,146],{"class":87},">\n",[70,148,150],{"class":72,"line":149},4,[70,151,152],{"class":87},"{\n",[70,154,156,159,161,165,167,170,172,176],{"class":72,"line":155},5,[70,157,158],{"class":76},"    new",[70,160,88],{"class":87},[70,162,164],{"class":163},"shWOn","\"Crêpes\"",[70,166,25],{"class":87},[70,168,169],{"class":163},"\"dessert\"",[70,171,25],{"class":87},[70,173,175],{"class":174},"s5iOY","30",[70,177,178],{"class":87},"),\n",[70,180,182,184,186,189,191,194,196,199],{"class":72,"line":181},6,[70,183,158],{"class":76},[70,185,88],{"class":87},[70,187,188],{"class":163},"\"Soupe\"",[70,190,25],{"class":87},[70,192,193],{"class":163},"\"plat\"",[70,195,25],{"class":87},[70,197,198],{"class":174},"45",[70,200,178],{"class":87},[70,202,204,206,208,211,213,216,218,221],{"class":72,"line":203},7,[70,205,158],{"class":76},[70,207,88],{"class":87},[70,209,210],{"class":163},"\"Salade\"",[70,212,25],{"class":87},[70,214,215],{"class":163},"\"entree\"",[70,217,25],{"class":87},[70,219,220],{"class":174},"10",[70,222,178],{"class":87},[70,224,226,228,230,233,235,237,239,242],{"class":72,"line":225},8,[70,227,158],{"class":76},[70,229,88],{"class":87},[70,231,232],{"class":163},"\"Tarte\"",[70,234,25],{"class":87},[70,236,169],{"class":163},[70,238,25],{"class":87},[70,240,241],{"class":174},"60",[70,243,244],{"class":87},")\n",[70,246,248],{"class":72,"line":247},9,[70,249,250],{"class":87},"};\n",[57,252,253,257,258,262,263,266],{},[254,255,256],"strong",{},"LINQ"," (",[259,260,261],"em",{},"Language Integrated Query",") est un ensemble de méthodes pour interroger une collection : filtrer, trier, transformer, calculer. Elles se trouvent dans l'espace de noms ",[22,264,265],{},"System.Linq",", que les projets récents importent automatiquement.",[10,268,270],{"id":269},"filtrer-avec-where","Filtrer avec Where",[57,272,273],{},"Tu veux seulement les recettes rapides :",[61,275,277],{"className":63,"code":276,"language":65,"meta":66,"style":66},"var rapides = recettes.Where(r => r.Minutes \u003C= 30);\n\nforeach (var r in rapides)\n{\n    Console.WriteLine(r.Nom);   \u002F\u002F Crêpes, puis Salade\n}\n",[22,278,279,313,317,335,339,354],{"__ignoreMap":66},[70,280,281,283,286,288,291,294,296,299,302,305,308,311],{"class":72,"line":73},[70,282,125],{"class":76},[70,284,285],{"class":83}," rapides",[70,287,131],{"class":76},[70,289,290],{"class":87}," recettes.",[70,292,24],{"class":293},"syCW7",[70,295,88],{"class":87},[70,297,298],{"class":83},"r",[70,300,301],{"class":76}," =>",[70,303,304],{"class":87}," r.Minutes ",[70,306,307],{"class":76},"\u003C=",[70,309,310],{"class":174}," 30",[70,312,112],{"class":87},[70,314,315],{"class":72,"line":115},[70,316,119],{"emptyLinePlaceholder":118},[70,318,319,322,324,326,329,332],{"class":72,"line":122},[70,320,321],{"class":76},"foreach",[70,323,257],{"class":87},[70,325,125],{"class":76},[70,327,328],{"class":83}," r",[70,330,331],{"class":76}," in",[70,333,334],{"class":87}," rapides)\n",[70,336,337],{"class":72,"line":149},[70,338,152],{"class":87},[70,340,341,344,347,350],{"class":72,"line":155},[70,342,343],{"class":87},"    Console.",[70,345,346],{"class":293},"WriteLine",[70,348,349],{"class":87},"(r.Nom);   ",[70,351,353],{"class":352},"sd6ml","\u002F\u002F Crêpes, puis Salade\n",[70,355,356],{"class":72,"line":181},[70,357,358],{"class":87},"}\n",[57,360,361,364,365,368,369,371,372,375,376,36],{},[22,362,363],{},"r => r.Minutes \u003C= 30"," est une ",[254,366,367],{},"expression lambda"," : une petite fonction sans nom. À gauche de la flèche, le paramètre ; à droite, le résultat. Ici, ",[22,370,298],{}," désigne chaque recette et la lambda répond ",[22,373,374],{},"true"," ou ",[22,377,378],{},"false",[10,380,382],{"id":381},"trier-et-transformer","Trier et transformer",[57,384,385,387,388,390],{},[22,386,31],{}," trie, ",[22,389,28],{}," transforme chaque élément. Tu les enchaînes :",[61,392,394],{"className":63,"code":393,"language":65,"meta":66,"style":66},"var noms = recettes\n    .OrderBy(r => r.Minutes)\n    .Select(r => r.Nom)\n    .ToList();\n\n\u002F\u002F Salade, Crêpes, Soupe, Tarte\n",[22,395,396,408,424,439,449,453],{"__ignoreMap":66},[70,397,398,400,403,405],{"class":72,"line":73},[70,399,125],{"class":76},[70,401,402],{"class":83}," noms",[70,404,131],{"class":76},[70,406,407],{"class":87}," recettes\n",[70,409,410,413,415,417,419,421],{"class":72,"line":115},[70,411,412],{"class":87},"    .",[70,414,31],{"class":293},[70,416,88],{"class":87},[70,418,298],{"class":83},[70,420,301],{"class":76},[70,422,423],{"class":87}," r.Minutes)\n",[70,425,426,428,430,432,434,436],{"class":72,"line":122},[70,427,412],{"class":87},[70,429,28],{"class":293},[70,431,88],{"class":87},[70,433,298],{"class":83},[70,435,301],{"class":76},[70,437,438],{"class":87}," r.Nom)\n",[70,440,441,443,446],{"class":72,"line":149},[70,442,412],{"class":87},[70,444,445],{"class":293},"ToList",[70,447,448],{"class":87},"();\n",[70,450,451],{"class":72,"line":155},[70,452,119],{"emptyLinePlaceholder":118},[70,454,455],{"class":72,"line":181},[70,456,457],{"class":352},"\u002F\u002F Salade, Crêpes, Soupe, Tarte\n",[57,459,460,461,464,465,36],{},"Chaque méthode renvoie un nouveau résultat, ce qui permet de les chaîner l'une après l'autre. ",[22,462,463],{},"ToList()"," termine en fabriquant une ",[22,466,467],{},"List",[57,469,470,471,473,474,36],{},"Pour un tri décroissant, remplace ",[22,472,31],{}," par ",[22,475,476],{},"OrderByDescending",[478,479,480],"note",{},[57,481,482,483,485],{},"Une requête LINQ ne s'exécute pas quand tu l'écris, mais quand tu la parcours ou que tu appelles ",[22,484,463],{},". On parle d'exécution différée. Pense à garder le résultat dans une liste si tu le réutilises.",[10,487,489],{"id":488},"calculer-et-regrouper","Calculer et regrouper",[57,491,492],{},"Quelques méthodes renvoient une valeur unique :",[61,494,496],{"className":63,"code":495,"language":65,"meta":66,"style":66},"int total = recettes.Sum(r => r.Minutes);          \u002F\u002F 145\ndouble moyenne = recettes.Average(r => r.Minutes); \u002F\u002F 36.25\nbool uneLongue = recettes.Any(r => r.Minutes > 50); \u002F\u002F True\n",[22,497,498,524,551],{"__ignoreMap":66},[70,499,500,502,505,507,509,512,514,516,518,521],{"class":72,"line":73},[70,501,106],{"class":76},[70,503,504],{"class":83}," total",[70,506,131],{"class":76},[70,508,290],{"class":87},[70,510,511],{"class":293},"Sum",[70,513,88],{"class":87},[70,515,298],{"class":83},[70,517,301],{"class":76},[70,519,520],{"class":87}," r.Minutes);          ",[70,522,523],{"class":352},"\u002F\u002F 145\n",[70,525,526,529,532,534,536,539,541,543,545,548],{"class":72,"line":115},[70,527,528],{"class":76},"double",[70,530,531],{"class":83}," moyenne",[70,533,131],{"class":76},[70,535,290],{"class":87},[70,537,538],{"class":293},"Average",[70,540,88],{"class":87},[70,542,298],{"class":83},[70,544,301],{"class":76},[70,546,547],{"class":87}," r.Minutes); ",[70,549,550],{"class":352},"\u002F\u002F 36.25\n",[70,552,553,556,559,561,563,566,568,570,572,574,577,580,583],{"class":72,"line":122},[70,554,555],{"class":76},"bool",[70,557,558],{"class":83}," uneLongue",[70,560,131],{"class":76},[70,562,290],{"class":87},[70,564,565],{"class":293},"Any",[70,567,88],{"class":87},[70,569,298],{"class":83},[70,571,301],{"class":76},[70,573,304],{"class":87},[70,575,576],{"class":76},">",[70,578,579],{"class":174}," 50",[70,581,582],{"class":87},"); ",[70,584,585],{"class":352},"\u002F\u002F True\n",[57,587,588,590],{},[22,589,35],{}," rassemble les éléments qui partagent une clé :",[61,592,594],{"className":63,"code":593,"language":65,"meta":66,"style":66},"var parCategorie = recettes.GroupBy(r => r.Categorie);\n\nforeach (var groupe in parCategorie)\n{\n    Console.WriteLine($\"{groupe.Key} : {groupe.Count()} recette(s)\");\n}\n",[22,595,596,618,622,638,642,687],{"__ignoreMap":66},[70,597,598,600,603,605,607,609,611,613,615],{"class":72,"line":73},[70,599,125],{"class":76},[70,601,602],{"class":83}," parCategorie",[70,604,131],{"class":76},[70,606,290],{"class":87},[70,608,35],{"class":293},[70,610,88],{"class":87},[70,612,298],{"class":83},[70,614,301],{"class":76},[70,616,617],{"class":87}," r.Categorie);\n",[70,619,620],{"class":72,"line":115},[70,621,119],{"emptyLinePlaceholder":118},[70,623,624,626,628,630,633,635],{"class":72,"line":122},[70,625,321],{"class":76},[70,627,257],{"class":87},[70,629,125],{"class":76},[70,631,632],{"class":83}," groupe",[70,634,331],{"class":76},[70,636,637],{"class":87}," parCategorie)\n",[70,639,640],{"class":72,"line":149},[70,641,152],{"class":87},[70,643,644,646,648,650,653,656,659,661,664,667,670,672,674,676,679,682,685],{"class":72,"line":155},[70,645,343],{"class":87},[70,647,346],{"class":293},[70,649,88],{"class":87},[70,651,652],{"class":163},"$\"",[70,654,655],{"class":163},"{",[70,657,658],{"class":87},"groupe",[70,660,36],{"class":163},[70,662,663],{"class":87},"Key",[70,665,666],{"class":163},"}",[70,668,669],{"class":163}," : ",[70,671,655],{"class":163},[70,673,658],{"class":87},[70,675,36],{"class":163},[70,677,678],{"class":293},"Count",[70,680,681],{"class":163},"()}",[70,683,684],{"class":163}," recette(s)\"",[70,686,112],{"class":87},[70,688,689],{"class":72,"line":181},[70,690,358],{"class":87},[57,692,693,694,696],{},"Chaque groupe porte sa clé dans ",[22,695,663],{}," et se parcourt comme une liste.",[698,699,700,713],"table",{},[701,702,703],"thead",{},[704,705,706,710],"tr",{},[707,708,709],"th",{},"Méthode",[707,711,712],{},"Rôle",[714,715,716,728,737,746,755,766],"tbody",{},[704,717,718,723],{},[719,720,721],"td",{},[22,722,24],{},[719,724,725,726],{},"Garde les éléments qui répondent ",[22,727,374],{},[704,729,730,734],{},[719,731,732],{},[22,733,28],{},[719,735,736],{},"Transforme chaque élément",[704,738,739,743],{},[719,740,741],{},[22,742,31],{},[719,744,745],{},"Trie par un critère",[704,747,748,752],{},[719,749,750],{},[22,751,35],{},[719,753,754],{},"Regroupe par clé",[704,756,757,763],{},[719,758,759,25,761],{},[22,760,511],{},[22,762,538],{},[719,764,765],{},"Calculent un total et une moyenne",[704,767,768,772],{},[719,769,770],{},[22,771,565],{},[719,773,774],{},"Dit si au moins un élément correspond",[10,776,778],{"id":777},"pourquoi-lasynchrone","Pourquoi l'asynchrone",[57,780,781,782,785],{},"Certaines opérations attendent : une réponse du réseau, la lecture d'un fichier. Si le programme se bloque pendant l'attente, il ne peut rien faire d'autre. Le code ",[254,783,784],{},"asynchrone"," libère le programme pendant ce temps.",[57,787,788],{},"En C#, trois éléments vont ensemble :",[790,791,792,798,803],"ol",{},[18,793,794,795,797],{},"Une ",[254,796,51],{}," représente un travail en cours qui rendra un résultat plus tard.",[18,799,800,802],{},[22,801,45],{}," marque une méthode qui peut attendre.",[18,804,805,807],{},[22,806,48],{}," attend la fin d'une tâche sans bloquer.",[10,809,811],{"id":810},"écrire-une-méthode-asynchrone","Écrire une méthode asynchrone",[61,813,815],{"className":63,"code":814,"language":65,"meta":66,"style":66},"static async Task\u003Cstring> ChargerRecetteAsync(string nom)\n{\n    await Task.Delay(1000);   \u002F\u002F simule une attente d'une seconde\n    return $\"Recette chargée : {nom}\";\n}\n\nstring texte = await ChargerRecetteAsync(\"Crêpes\");\nConsole.WriteLine(texte);\n",[22,816,817,847,851,873,894,898,902,923],{"__ignoreMap":66},[70,818,819,822,825,828,830,832,835,838,840,842,845],{"class":72,"line":73},[70,820,821],{"class":76},"static",[70,823,824],{"class":76}," async",[70,826,827],{"class":83}," Task",[70,829,140],{"class":87},[70,831,91],{"class":76},[70,833,834],{"class":87},"> ",[70,836,837],{"class":293},"ChargerRecetteAsync",[70,839,88],{"class":87},[70,841,91],{"class":76},[70,843,844],{"class":83}," nom",[70,846,244],{"class":87},[70,848,849],{"class":72,"line":115},[70,850,152],{"class":87},[70,852,853,856,859,862,864,867,870],{"class":72,"line":122},[70,854,855],{"class":76},"    await",[70,857,858],{"class":87}," Task.",[70,860,861],{"class":293},"Delay",[70,863,88],{"class":87},[70,865,866],{"class":174},"1000",[70,868,869],{"class":87},");   ",[70,871,872],{"class":352},"\u002F\u002F simule une attente d'une seconde\n",[70,874,875,878,881,883,886,888,891],{"class":72,"line":149},[70,876,877],{"class":76},"    return",[70,879,880],{"class":163}," $\"Recette chargée : ",[70,882,655],{"class":163},[70,884,885],{"class":87},"nom",[70,887,666],{"class":163},[70,889,890],{"class":163},"\"",[70,892,893],{"class":87},";\n",[70,895,896],{"class":72,"line":155},[70,897,358],{"class":87},[70,899,900],{"class":72,"line":181},[70,901,119],{"emptyLinePlaceholder":118},[70,903,904,906,909,911,914,917,919,921],{"class":72,"line":203},[70,905,91],{"class":76},[70,907,908],{"class":83}," texte",[70,910,131],{"class":76},[70,912,913],{"class":76}," await",[70,915,916],{"class":293}," ChargerRecetteAsync",[70,918,88],{"class":87},[70,920,164],{"class":163},[70,922,112],{"class":87},[70,924,925,928,930],{"class":72,"line":225},[70,926,927],{"class":87},"Console.",[70,929,346],{"class":293},[70,931,932],{"class":87},"(texte);\n",[57,934,935,936,669,938,941,942,944,945,36],{},"Une méthode asynchrone renvoie une ",[22,937,51],{},[22,939,940],{},"Task\u003Cstring>"," pour produire un texte, ",[22,943,51],{}," seule pour ne rien produire. Par convention, son nom finit par ",[22,946,947],{},"Async",[57,949,950,952],{},[22,951,48],{}," suspend la méthode jusqu'au résultat, puis reprend avec la valeur. Pendant l'attente, le thread reste libre.",[10,954,956],{"id":955},"appeler-un-site-web","Appeler un site web",[57,958,959,960,963],{},"L'exemple le plus courant est une requête HTTP avec ",[22,961,962],{},"HttpClient"," :",[61,965,967],{"className":63,"code":966,"language":65,"meta":66,"style":66},"using var client = new HttpClient();\nstring contenu = await client.GetStringAsync(\"https:\u002F\u002Fexample.com\");\nConsole.WriteLine(contenu.Length);\n",[22,968,969,989,1013],{"__ignoreMap":66},[70,970,971,974,977,980,982,984,987],{"class":72,"line":73},[70,972,973],{"class":76},"using",[70,975,976],{"class":76}," var",[70,978,979],{"class":83}," client",[70,981,131],{"class":76},[70,983,134],{"class":76},[70,985,986],{"class":83}," HttpClient",[70,988,448],{"class":87},[70,990,991,993,996,998,1000,1003,1006,1008,1011],{"class":72,"line":115},[70,992,91],{"class":76},[70,994,995],{"class":83}," contenu",[70,997,131],{"class":76},[70,999,913],{"class":76},[70,1001,1002],{"class":87}," client.",[70,1004,1005],{"class":293},"GetStringAsync",[70,1007,88],{"class":87},[70,1009,1010],{"class":163},"\"https:\u002F\u002Fexample.com\"",[70,1012,112],{"class":87},[70,1014,1015,1017,1019],{"class":72,"line":122},[70,1016,927],{"class":87},[70,1018,346],{"class":293},[70,1020,1021],{"class":87},"(contenu.Length);\n",[57,1023,1024,1026,1027,1029,1030,1032,1033,1035],{},[22,1025,1005],{}," renvoie une ",[22,1028,940],{},". Avec ",[22,1031,48],{},", tu obtiens directement le texte de la page. Le mot-clé ",[22,1034,973],{}," libère le client à la fin.",[1037,1038,1039],"warning",{},[57,1040,1041,1042,375,1045,1048,1049,32,1051,1053],{},"Évite ",[22,1043,1044],{},".Result",[22,1046,1047],{},".Wait()"," sur une tâche : ils bloquent le programme et peuvent provoquer un blocage total. Remonte plutôt ",[22,1050,45],{},[22,1052,48],{}," jusqu'à la méthode appelante.",[10,1055,1057],{"id":1056},"attendre-plusieurs-tâches","Attendre plusieurs tâches",[57,1059,1060,1061,963],{},"Pour lancer plusieurs travaux en même temps, démarre les tâches puis attends-les avec ",[22,1062,1063],{},"Task.WhenAll",[61,1065,1067],{"className":63,"code":1066,"language":65,"meta":66,"style":66},"Task\u003Cstring> a = ChargerRecetteAsync(\"Crêpes\");\nTask\u003Cstring> b = ChargerRecetteAsync(\"Tarte\");\n\nstring[] resultats = await Task.WhenAll(a, b);\n",[22,1068,1069,1092,1115,1119],{"__ignoreMap":66},[70,1070,1071,1073,1075,1077,1079,1082,1084,1086,1088,1090],{"class":72,"line":73},[70,1072,51],{"class":83},[70,1074,140],{"class":87},[70,1076,91],{"class":76},[70,1078,834],{"class":87},[70,1080,1081],{"class":83},"a",[70,1083,131],{"class":76},[70,1085,916],{"class":293},[70,1087,88],{"class":87},[70,1089,164],{"class":163},[70,1091,112],{"class":87},[70,1093,1094,1096,1098,1100,1102,1105,1107,1109,1111,1113],{"class":72,"line":115},[70,1095,51],{"class":83},[70,1097,140],{"class":87},[70,1099,91],{"class":76},[70,1101,834],{"class":87},[70,1103,1104],{"class":83},"b",[70,1106,131],{"class":76},[70,1108,916],{"class":293},[70,1110,88],{"class":87},[70,1112,232],{"class":163},[70,1114,112],{"class":87},[70,1116,1117],{"class":72,"line":122},[70,1118,119],{"emptyLinePlaceholder":118},[70,1120,1121,1123,1126,1129,1131,1133,1135,1138],{"class":72,"line":149},[70,1122,91],{"class":76},[70,1124,1125],{"class":87},"[] ",[70,1127,1128],{"class":83},"resultats",[70,1130,131],{"class":76},[70,1132,913],{"class":76},[70,1134,858],{"class":87},[70,1136,1137],{"class":293},"WhenAll",[70,1139,1140],{"class":87},"(a, b);\n",[57,1142,1143],{},"Les deux chargements se déroulent en parallèle : le total dure environ une seconde, pas deux.",[10,1145,1147],{"id":1146},"à-retenir","À retenir",[15,1149,1150,1164,1171,1183,1194],{},[18,1151,1152,1153,1155,1156,1158,1159,387,1161,1163],{},"LINQ interroge une collection : ",[22,1154,24],{}," filtre, ",[22,1157,28],{}," transforme, ",[22,1160,31],{},[22,1162,35],{}," regroupe.",[18,1165,1166,1167,1170],{},"Une lambda ",[22,1168,1169],{},"x => expression"," est une petite fonction sans nom, très utilisée avec LINQ.",[18,1172,1173,25,1175,32,1177,1179,1180,1182],{},[22,1174,511],{},[22,1176,538],{},[22,1178,565],{}," renvoient une valeur unique ; ",[22,1181,463],{}," fabrique une liste du résultat.",[18,1184,1185,1186,1026,1188,1190,1191,1193],{},"Une méthode ",[22,1187,45],{},[22,1189,51],{}," et utilise ",[22,1192,48],{}," pour attendre sans bloquer.",[18,1195,1196,1198,1199,32,1201,36],{},[22,1197,1063],{}," attend plusieurs tâches lancées ensemble ; évite ",[22,1200,1044],{},[22,1202,1047],{},[1204,1205,1206],"style",{},"html pre.shiki code .sOnC1, html code.shiki .sOnC1{--shiki-light:#CF222E;--shiki-default:#FF7B72;--shiki-dark:#FF7B72}html pre.shiki code .sIXEE, html code.shiki .sIXEE{--shiki-light:#953800;--shiki-default:#FFA657;--shiki-dark:#FFA657}html pre.shiki code .scfrF, html code.shiki .scfrF{--shiki-light:#1F2328;--shiki-default:#E6EDF3;--shiki-dark:#E6EDF3}html pre.shiki code .shWOn, html code.shiki .shWOn{--shiki-light:#0A3069;--shiki-default:#A5D6FF;--shiki-dark:#A5D6FF}html pre.shiki code .s5iOY, html code.shiki .s5iOY{--shiki-light:#0550AE;--shiki-default:#79C0FF;--shiki-dark:#79C0FF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .syCW7, html code.shiki .syCW7{--shiki-light:#8250DF;--shiki-default:#D2A8FF;--shiki-dark:#D2A8FF}html pre.shiki code .sd6ml, html code.shiki .sd6ml{--shiki-light:#6E7781;--shiki-default:#8B949E;--shiki-dark:#8B949E}",{"title":66,"searchDepth":115,"depth":122,"links":1208},[1209,1210,1211,1212,1213,1214,1215,1216,1217,1218],{"id":12,"depth":115,"text":13},{"id":54,"depth":115,"text":55},{"id":269,"depth":115,"text":270},{"id":381,"depth":115,"text":382},{"id":488,"depth":115,"text":489},{"id":777,"depth":115,"text":778},{"id":810,"depth":115,"text":811},{"id":955,"depth":115,"text":956},{"id":1056,"depth":115,"text":1057},{"id":1146,"depth":115,"text":1147},"Filtrer, trier et calculer sur des collections avec LINQ, puis écrire du code asynchrone avec Task, async et await.","md",{},[256,24,28,31,35,1223,45,48,51,962],"lambda","avance","\u002Fcsharp\u002Flinq-et-async",[1227],"\u002Fcsharp\u002Fheritage-et-interfaces",[1229,1233,1237],{"nom":1230,"url":1231,"type":1232},"Parcours Microsoft Learn, Débuter avec C#","https:\u002F\u002Flearn.microsoft.com\u002Ffr-fr\u002Ftraining\u002Fpaths\u002Fget-started-c-sharp-part-1\u002F","cours",{"nom":1234,"url":1235,"type":1236},"LINQ en C# (Microsoft)","https:\u002F\u002Flearn.microsoft.com\u002Ffr-fr\u002Fdotnet\u002Fcsharp\u002Flinq\u002F","doc",{"nom":1238,"url":1239,"type":1236},"Programmation asynchrone en C# (Microsoft)","https:\u002F\u002Flearn.microsoft.com\u002Ffr-fr\u002Fdotnet\u002Fcsharp\u002Fasynchronous-programming\u002F",{"title":5,"description":1219},[1242,1244,1247],{"nom":1243,"url":1235},"LINQ en C#",{"nom":1245,"url":1246},"Opérateurs de requête standard","https:\u002F\u002Flearn.microsoft.com\u002Ffr-fr\u002Fdotnet\u002Fcsharp\u002Flinq\u002Fstandard-query-operators\u002F",{"nom":1248,"url":1239},"Programmation asynchrone","csharp\u002F06.linq-et-async","V9i3mc3jram_8TLljQIQg_fpv9i7Y9qhOCPYrH-ccM4",[1252,1256,1260,1264,1268,1271,1272],{"path":1253,"title":1254,"stem":1255},"\u002Fcsharp\u002Fpremier-programme","Premier programme C#","csharp\u002F01.premier-programme",{"path":1257,"title":1258,"stem":1259},"\u002Fcsharp\u002Fconditions-boucles-methodes","Conditions, boucles et méthodes","csharp\u002F02.conditions-boucles-methodes",{"path":1261,"title":1262,"stem":1263},"\u002Fcsharp\u002Fcollections-et-exceptions","Collections et exceptions","csharp\u002F03.collections-et-exceptions",{"path":1265,"title":1266,"stem":1267},"\u002Fcsharp\u002Fclasses-proprietes-records","Classes, propriétés et records","csharp\u002F04.classes-proprietes-records",{"path":1227,"title":1269,"stem":1270},"Héritage et interfaces","csharp\u002F05.heritage-et-interfaces",{"path":1225,"title":5,"stem":1249},{"path":1273,"title":1274,"stem":1275},"\u002Fcsharp","C#","csharp\u002Findex",[1277,1279],{"title":1269,"path":1227,"stem":1270,"description":1278,"children":-1},"Réutiliser du code avec l'héritage, redéfinir un comportement avec virtual et override, et décrire un contrat commun avec une interface.",null,[1281],{"path":1227,"title":1269,"ligne":65},[1283,1285,1286,1287,1289,1290,1291],{"path":1253,"title":1254,"niveau":1284,"stem":1255},"debutant",{"path":1257,"title":1258,"niveau":1284,"stem":1259},{"path":1261,"title":1262,"niveau":1284,"stem":1263},{"path":1265,"title":1266,"niveau":1288,"stem":1267},"intermediaire",{"path":1227,"title":1269,"niveau":1288,"stem":1270},{"path":1225,"title":5,"niveau":1224,"stem":1249},{"path":1273,"title":1274,"niveau":1292,"stem":1275},"memo",1794583458646]