11
votes

Initialiser un tableau déchiqueté de la voie Linq

J'ai un tableau en dents de scie 2 dimensions (si elle est toujours rectangulaire), que j'initialiser en utilisant la boucle traditionnelle:

double[][] myArr = Enumerable.Repeat(new double[colCount], rowCount).ToArray();


0 commentaires

6 Réponses :


26
votes
double[][] myArr = Enumerable
  .Range(0, rowCount)
  .Select(i => new double[colCount])
  .ToArray();

0 commentaires

1
votes

Ce que vous avez ne fonctionnerez pas comme le nouveau se produit avant l'appel sur répéter . Vous avez besoin de quelque chose qui répète également la création de la matrice. Ceci peut être atteint à l'aide de énumérable.Range méthode pour générer une plage, puis effectuer un Sélectionnez OPÉRATION qui mappe chaque élément de la plage à une nouvelle instance de tableau (comme dans La réponse d'Amy B ).

Cependant, je pense que vous essayez d'utiliser Linq où il n'est pas vraiment approprié de faites-le dans ce cas. Ce que vous aviez avant la solution LINQ, c'est bien. Bien sûr, si vous vouliez une approche de style Linq similaire à énumérable. Répétez , vous pouvez écrire votre propre méthode d'extension générant un nouvel élément, tel que: xxx

alors vous pouvez l'appeler comme suit: < / p> xxx


1 commentaires

exactement la même réponse que la mienne ... mais tu étais plus rapide;)



0
votes

Le comportement est correct - répéter () code> retourne une séquence contenant l'objet fourni plusieurs fois. Vous pouvez faire le tour suivant.

double[][] myArr = Enumerable
    .Repeat(0, rowCount)
    .Select(i => new double[colCount])
    .ToArray();


0 commentaires

0
votes

Vous ne pouvez pas faire cela avec la méthode répéter code>: le paramètre electronique code> n'est évalué qu'une seule fois, il répète toujours la même instance. Au lieu de cela, vous pouvez créer une méthode pour faire ce que vous voulez, qui prendrait une Lambda au lieu d'une valeur:

    public static IEnumerable<T> Sequence<T>(Func<T> generator, int count)
    {
        for (int i = 0; i < count; i++)
        {
            yield return generator();
        }
    }

    ...

    var myArr = Sequence(() => new double[colCount], rowCount).ToArray();


0 commentaires

0
votes

Je viens d'écrire cette fonction ...

float[][] vertices = GetMatrix<float>(8, 3);


0 commentaires