2009-02-16 9 views
1

J'ai une méthode qui obtient un tableau imbriqué comme paramètre:LINQ Requêtes ignorées. Pourquoi?

Number[][] data 

où numéro est ma classe très simple qui hérite de INotifyPropertyChange.

Et puis j'ai une déclaration comme celle-ci:

double[] max = (double[])data.Select(crArray => crArray.Select(cr => cr.ValueNorm).Max()); 

Quand je suis en train de regarder dans le débogueur, il saute juste et toute la méthode mais pas exception ressorte.

Quelle est la réponse? Et quelle est la meilleure façon de le faire.

Je peux utiliser des boucles, bien sûr - mais il semble si sale et long. Ainsi, LINQ est préférable

P.S. J'utilise VS2008 SP1

Répondre

1

Etes-vous sûr que la méthode Select renvoie un tableau? Coulée + génériques = odeur de code

essayer ceci:

double[] max = data 
    .Select(crArray => crArray.Select(cr => cr.ValueNorm).Max()) 
    .ToArray(); 

Procédé de conversion - (ToArray) alloue une nouvelle matrice et remplit elle. Lié par les restrictions de méthodes.

Down Casting - Vous permet de changer le type de référence à une instance d'objet. Seul le type d'instance réel ou un type dont le type d'instance hérite est autorisé. Tout le reste donne une exception d'exécution.

Opérateur de conversion explicite - utilise la syntaxe de la diffusion descendante pour obtenir l'effet de conversion. C'est vraiment une méthode de conversion. C'est une source de confusion sans fin pour les gens qui essaient de comprendre le casting.

Tenir compte de ce code:

// reference type is IEnumerable<string>, instance type is string[] 
IEnumerable<string> myArray = 
    new string[3] { "abc", "def", "ghi" }; 
// reference type is IEnumerable<string>, instance type is ??? 
IEnumerable<string> myQuery = myArray 
    .Select(s => s.Reverse().ToString()); 

//Cast - works 
string[] result = (string[]) myArray; 
//Cast - runtime exception: System.InvalidCastException 
result = (string[])myQuery; 
//Conversion - works 
result = myQuery.ToArray(); 

Pourquoi ne pas vous obtenez une exception d'exécution en contre? Je ne sais pas.

+0

Non, ça renvoie IEnumerable , mais je pensais que casting et ToArray() font la même chose - en transformant IEnumerable en Array Votre méthode fonctionne réellement, mais Quelle est la différence? Et pourquoi ce comportement étrange de Visual Studio? – Aks1

+0

Ouais, je pense vraiment qu'il utilisera l'opérateur de conversion Thx pour la réponse) – Aks1

1

Habituellement, ce type de comportement signifie que vos fichiers de code source ne sont pas à jour. Essayez de supprimer tous les fichiers .bin et .pdb du répertoire de sortie et de les reconstruire.

0

Avez-vous essayé de parcourir au maximum? Je pense que cela ne s'est pas produit car vous n'avez pas parcouru le résultat de votre requête (Linq ne lance votre requête qu'après le premier appel de GetEnumerator.)

La méthode ToArray parcourt l'énumération de votre requête et copie tous les Je pense que c'est la différence