1
votes

Ho pour obtenir la clé et la valeur dans LINQ à partir du centile de score

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();
    }
}

entrez la description de l'image ici

entrez description de l'image ici

 entrez la description de l'image ici


2 commentaires

Vous devez stocker le résultat de nums.ToLookup ...... . Vous l'ignorez actuellement, puis vous énumérez la variable d'origine nums


définir le résultat sur une nouvelle liste et l'imprimer, la requête All Linq ne modifie pas la liste d'origine


4 Réponses :


1
votes

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


1 commentaires

Vous êtes super rapide :)



1
votes

Essayez d'attribuer des nombres à une nouvelle variable (par exemple, items ):

Essayez-le en ligne !

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();
}


1 commentaires

Merci à tous pour votre aide.



1
votes

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();


0 commentaires

0
votes

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();
}


0 commentaires