2009-09-28 6 views
4

je reçois une erreur du code suivant:LINQ: ne peut pas convertir implicitement le type « System.Collections.Generic.IEnumerable <int> » à « int »

int dreamX[]; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    sumX(); 
} 

private void sumX() 
{ 
    for (var i = 0; i < 8; i++) 
    { 
     dreamX[i] = 
      from Control control in Controls 
      where 
       control.GetType() == typeof(TextBox) 
       && control.Name.StartsWith("box") 
      select Convert.ToInt32(((TextBox)control).Text); 
    } 
} 

Je reçois cette erreur, comment convertir explicitement ce.

"Impossible de convertir implicitement le type 'System.Collections.Generic.IEnumerable -int-' à 'int'"

+0

Um, comment avez-vous même obtenu "int dreamX [];" compiler? Qu'est-ce que c'est censé vouloir dire? –

+3

@Joel: donnez une pause au gars! Il apprend et s'amuse clairement. – Dabblernl

Répondre

7

Ce que vous voulez est ceci:

int[] dreamX; 
private void Form1_Load(object sender, EventArgs e) 
     { 
     sumX(); 
     } 
private void sumX() 
     { 
       dreamX =(from Control control in Controls     
         where control.GetType() == typeof(TextBox) && 
           control.Name.StartsWith("box") 
         select Convert.ToInt32(((TextBox)control).Text)) 
             .ToArray();    
     } 

La clause de produit une collection IEnumerable. Vous pouvez convertir ceci en un tableau avec l'extension .ToArray()

+0

très agréable a travaillé comme un rêve :) – Darkmage

3

FirstOrDefault() tournera la IEnumerable<int> dans un int.

En fait, il prend la première occurrence dans le outputresult de votre requête linq.

+1

Seulement s'il y a au moins un élément :-). Sinon, il renvoie 0. – Joey

+0

Oui, c'est vrai. – Natrium

13

Eh bien, cette requête peut renvoyer plusieurs valeurs, vous devez donc utiliser les méthodes d'extension .Single(), .First() ou .FirstOrDefault().

Notez que Single() ne fonctionnera que s'il y a exactement un élément dans la liste, First() ne fonctionnera que s'il y a au moins un élément dans la liste. FirstOrDefault() rétablit la valeur par défaut (0) s'il n'y a aucun élément dans la liste.

Selon exactement ce dont vous avez besoin, vous devrez choisir :)

11

Tant de choses de mal à cela.

Tout d'abord, vous essayez d'affecter ce qui est potentiellement de nombreux entiers convertis à un seul nombre entier dans un tableau. C'est ce que le message d'erreur vous dit.

En outre, nulle part dans le code que vous avez montré est ce tableau jamais initialisé. Donc, même si vous appelez quelque chose comme .FirstOrDefault() vous finirez avec un NullReferenceException. Le mieux est de ne pas utiliser d'arraries du tout si vous pouvez l'aider. Il suffit de coller avec IEnumerable.

En outre, vous êtes linq requête a une étape supplémentaire; plutôt que de vérifier le type de chaque contrôle dans la collection Controls, vous devez appeler sa méthode .OfType(). Finalement, la beauté de linq est que vous n'avez même pas à écrire la boucle for. Vous pouvez simplement écrire une instruction qui évalue toutes vos zones de texte.

IEnumerable<int> dreamX; 

private void Form1_Load(object sender, EventArgs e) 
{ 
    sumX(); 
    int totalX = dreamX.Sum(); 
} 

private void sumX() 
{ 
    dreamX = from control in Controls.OfType<TextBox>() 
      where control.Name.StartsWith("box") 
      select Convert.ToInt32(control.Text); 
} 
+0

+1 pour résoudre des problèmes plus fondamentaux avec le code. – Joey

Questions connexes