Bonjour, je lis un livre intitulé "Penser en LINQ", à la page 11, il y a l'extrait de code ci-dessous qui, si vous utilisez LINQPad, il s'affiche correctement (colonnes Clé et Valeur) ... Cependant, je teste tous les exemples de code de livre dans C # / Console App car je travaille en C # au travail, pas en LINQ ...
Comment pourrais-je obtenir le même résultat dans un C #? comme j'ai essayé beaucoup de choses mais n'affiche pas la valeur, seulement la clé.
PS: Je sais que dans le livre ils ont utilisé Dump mais VS n'a pas de méthode Dump, nous pouvons remplacer Dump par une variable affectation et utilisez la variable dans une Console.WriteLine pour afficher les données. Je l'ai essayé dans un autre exemple du livre et j'ai bien fonctionné.
static void Main(string[] args)
{
int[] nums = { 20, 15, 31, 34, 35, 40, 50, 90, 99, 100 };
nums.ToLookup(k => k, k => nums.Where(n => n < k))
.Select(k => new KeyValuePair<int, double>
(k.Key, 100 * ((double)k.First().Count() / (double)nums.Length)));
foreach (var item in nums)
{
Console.WriteLine("{0}", item);
}
Console.Read();
}
}
4 Réponses :
Vous avez oublié d'attribuer le résultat de la méthode Select à une variable de votre code, vous énumérez actuellement la collection nums source. Sélectionnez code> renvoie une instance IEnumerable, cela ne change pas la collection source. Vous devez attribuer cette instance et énumérer ensuite
var result = nums.ToLookup(k => k, k => nums.Where(n => n < k))
.Select(k => new KeyValuePair<int, double>
(k.Key, 100 * ((double)k.First().Count() / (double)nums.Length)));
foreach (var item in result)
{
Console.WriteLine("{0}", item);
}
Le code du livre utilise également la méthode Dump de LinqPad , qui est manquante dans votre code . En fait, cette méthode produira le résultat utile, que vous verrez dans le livre
Vous êtes super rapide :)
Essayez d'attribuer des nombres à une nouvelle variable (par exemple, items ):
static void Main(string[] args)
{
int[] nums = { 20, 15, 31, 34, 35, 40, 50, 90, 99, 100 };
// here we go
var items = nums.ToLookup(k => k, k => nums.Where(n => n < k))
.Select(k => new KeyValuePair<int, double>
(k.Key, 100 * ((double)k.First().Count() / (double)nums.Length)));
foreach (var item in items)
{
Console.WriteLine("{0}", item);
}
Console.Read();
}
Merci à tous pour votre aide.
Vous devriez prendre le LINQ vers une autre variable
int[] nums = { 20, 15, 31, 34, 35, 40, 50, 90, 99, 100 };
var results = nums.ToLookup(k => k, k => nums.Where(n => n < k))
.Select(k => new KeyValuePair<int, double>
(k.Key, 100 * ((double)k.First().Count() / (double)nums.Length)));
foreach (var item in results)
{
Console.WriteLine("{0}", item);
}
Console.Read();
En C #, vous imprimez simplement la collection nums en utilisant la boucle for. La capture d'écran du livre montre qu'il y a Dump à la fin de la conversion en recherche. Ainsi, pour obtenir exactement le même résultat, vous devez énumérer nums après la conversion en recherche comme indiqué ci-dessous: (ToLookup ne modifiera pas la collection de base qui est la collection de nombres entiers en collection de paires clé-valeur en appelant la méthode.)
static void Main(string[] args)
{
int[] nums = { 20, 15, 31, 34, 35, 40, 50, 90, 99, 100 };
var numsLookup = nums.ToLookup(k => k, k => nums.Where(n => n < k))
.Select(k => new KeyValuePair<int, double>
(k.Key, 100 * ((double)k.First().Count() / (double)nums.Length)));
Console.WriteLine("\tKey\t\tValue");
Console.WriteLine("================");
foreach (var item in numsLookup)
{
Console.WriteLine("{0}\t\t {1}", item.Key, item.Value);
}
Console.Read();
}
Vous devez stocker le résultat de
nums.ToLookup ....... Vous l'ignorez actuellement, puis vous énumérez la variable d'originenumsdéfinir le résultat sur une nouvelle liste et l'imprimer, la requête All
Linqne modifie pas la liste d'origine