2011-08-18 2 views
4

J'utilise LINQ et renvoie une liste à ma couche logique métier. Je suis en train de changer l'une des valeurs de la liste (en changeant la note 'étoile' en une image avec le nombre d'étoiles).C# For Loop avec LIST utilisant LINQ

Bien que le compteur (i) semble fonctionner, la boucle FOR ne fonctionne pas correctement. La première fois à travers elle s'arrête à la bonne IF, mais alors il sort à l'instruction ELSE pour tout et toutes les valeurs se terminent par "star0.png". Il semble que je ne suis pas à vélo dans la liste ??? Merci d'avance!

for (int i = 0; i < ReviewList.Count; i++) 
    { 
     string serviceCode = ReviewList[i].SERVICE.SERVICE_DESC; 
     if (serviceCode == "*") 
     { 
      ReviewList[i].SERVICE.SERVICE_DESC = "star1.png"; 
     } 
     else if (serviceCode == "**") 
     { 
      ReviewList[i].SERVICE.SERVICE_DESC = "star2.png"; 
     } 
     else if (serviceCode == "***") 
     { 
      ReviewList[i].SERVICE.SERVICE_DESC = "star3.png"; 
     } 
     else if (serviceCode == "****") 
     { 
      ReviewList[i].SERVICE.SERVICE_DESC = "star4.png"; 
     } 
     else 
     { 
      ReviewList[i].SERVICE.SERVICE_DESC = "star0.png"; 
     } 
    } 
+0

Avez-vous essayez d'utiliser un élément de foreach dans la boucle de la liste? – mcass20

+1

La boucle elle-même me semble juste. Que se passe-t-il lorsque vous parcourez le débogueur? Quelles sont les valeurs du 'serviceCode's? – StriplingWarrior

+0

Avez-vous confirmé le contenu de 'ReviewList'? – dlev

Répondre

2

Je ne pense pas que son problème de for loop fonctionne correctement ... votre syntaxe est bonne et comme écrit itérera ReviewList.Count nombre de fois.

Je passerais en revue et vérifier le contenu de ReviewList en premier.

Laissez-moi savoir ce que vous trouvez

+0

Alors, voici ce que j'ai fait. (1) a changé serviceCode en Integer et la valeur qu'il compare est la valeur Identity de la table. Donc, si SERVICe_ID = 1, REVIEWLIST [I] .SERVICE.SERVICE_DESC = star1.png. ça fonctionne parfaitement. Comme je suis capable de tirer SERVICE.SERVICE_DESC dans l'interface utilisateur, je ne comprends pas pourquoi cela ne fonctionnerait pas dans ma couche logique de bus. Des idées??? Eh bien, merci pour l'aide !!! – Susan

+0

difficile à dire sans regarder le code entièrement ...si je comprends des commentaires que vous avez résolu votre problème, ce qui est une bonne chose :) – quashBox

1

Si vous connaissez chaque élément sera composé d'un certain nombre d'étoiles, pourquoi ne pas le faire ?:

for (int i = 0; i < ReviewList.Count; i++) 
{ 
    string serviceCode = ReviewList[i].SERVICE.SERVICE_DESC; 
    ReviewList[i].SERVICE.SERVICE_DESC = "star" + serviceCode.Length + ".png"; 
} 
+0

En théorie, cela ne tient pas compte du 'else' complètement (bien que cela puisse être en pratique.) – dlev

+0

vous auriez besoin d'un tri ou vérifiez que chaque élément de la chaîne est un symbole *, et une vérification de la longueur à faire bien sûr, il n'y en a pas plus de 4 – Manatherin

3

Si toutes les valeurs finissent par à star0.png, alors vous êtes à vélo par la liste. Le fait que l'instruction else soit le seul code exécuté pour chaque élément suggère une erreur logique - vouliez-vous peut-être faire quelque chose comme ça?

string serviceCode = ReviewList[i].SERVICE.SERVICE_CODE; 
+0

C'était aussi ma réaction ... "toutes les valeurs" signifie que le cycle de la boucle fonctionne. –

+0

Belle observation! – Mehran

+0

La seule différence que je remarque dans votre code est que vous avez remplacé SERVICE.SERVICE_DESC par SERVICE.SERVICE_CODE. Ce dernier est un nombre entier dans ma table et est la valeur Identify dans cette table. – Susan

0

Protection sur double passe et état autre

for (int i = 0; i < ReviewList.Count; i++) 
{ 
    string serviceCode = ReviewList[i].SERVICE.SERVICE_DESC; 
    if(!serviceCode.Contains(".png")) { // once name set should not be modified 
     if(serviceCode.Contains("*")) 
     ReviewList[i].SERVICE.SERVICE_DESC = "star" + serviceCode.Length + ".png"; 
     else 
     ReviewList[i].SERVICE.SERVICE_DESC = "star0.png"; 

    } 
} 

autre approche LINQ

 ReviewList.ForEach(rs=>if(!rs.SERVICE.SERVICE_DESC.Contains(".png")) 
{ rs.SERVICE.SERVICE_DESC = 
    "star" + rs.SERVICE.SERVICE_DESC.Length + ".png"});