2015-10-06 6 views
2

À l'heure actuelle, mon code a 52 cases à cocher qui renvoient chacune leur propre valeur.Comment créer une instruction conditionnelle-OU qui s'exécute plusieurs fois si plusieurs conditions sont remplies

if (checkedListBox1.GetItemCheckState(0) == CheckState.Checked) 
      { 
       x += 1; 
      } 
if (checkedListBox1.GetItemCheckState(1) == CheckState.Checked) 
      { 
       x += 2; 
      } 
if (checkedListBox1.GetItemCheckState(2) == CheckState.Checked) 
      { 
       x += 1; 
      } 

Je veux groupe si des déclarations qui font la même chose dans une déclaration unique, quelque chose comme

if (checkedListBox1.GetItemCheckState(0) == CheckState.Checked || 
    checkedListBox1.GetItemCheckState(2) == CheckState.Checked || 
    checkedListBox1.GetItemCheckState(17) == CheckState.Checked) 
      { 
       x += 1; 
      } 

Toutefois, un tel code ne fonctionnera qu'une seule fois. Y a-t-il un opérateur qui aiderait dans cette situation ou devrais-je simplement écrire 52 if statements.

+0

Qu'est-ce qui détermine ce que vous incrémentez par «x»? Ceci est criant pour une boucle, mais jusqu'à ce que je sache si vous êtes incrémenté 'x' par' 1' ou '2' je ne peux pas comprendre comment il serait écrit. –

+0

Votre exigence actuelle est d'obtenir le nombre de cases cochées dans la liste de cases à cocher, n'est-ce pas? –

+1

La liste vérifiée est un système de points et différentes choses dans la liste donnent des points différents. EDIT: Plus précisément, c'est la liste yaku https://en.wikipedia.org/wiki/Japanese_Mahjong_yaku chaque yaku donne une quantité spécifique de han et j'utilise une case à cocher pour calculer combien vous avez basé sur ce que vous avez. – GSerra

Répondre

1

Je voudrais créer un tableau int[] des scores avec une entrée pour chaque case à cocher possible:

var scores = new [] 
{ 
    1, 
    2, 
    1, 
    4, 
    2, 
    1, 
    // Etc up to 52 items 
}; 

Ensuite, vous pouvez juste boucle si toutes les cases à cocher et additionnent tous les scores:

for (int i = 0; i < checkedListBox1.Items.Count; ++i) 
    if (checkedListBox1.GetItemCheckState(i)) == CheckState.Checked) 
     x += scores[i]; 

Vous pouvez également utiliser CheckedListBox.CheckedIndices pour parcourir les éléments cochés, ce qui ressemblerait à ceci:

x = checkedListBox1.CheckedIndices.Cast<int>().Sum(i=> scores[i]); 

Une meilleure façon d'aborder cela, IMO, est d'écrire une classe spéciale Yaku qui est utilisée pour contenir des informations sur chaque élément de la liste. Cela inclurait le nom et le score (han). Il remplacerait également ToString() afin que le nom soit affiché dans la liste.

Il pourrait sembler un peu comme ceci:

public class Yaku 
{ 
    public string Name { get; } 
    public int Han { get; } 

    public Yaku(string name, int han) 
    { 
     Name = name; 
     Han = han; 
    } 

    public override string ToString() 
    { 
     return Name; 
    } 
} 

Ensuite, vous pouvez initialiser la liste vérifiée quelque part comme ceci:

public Form1() 
{ 
    InitializeComponent(); 

    checkedListBox1.Items.Add(new Yaku("Little three dragons", 4)); 
    checkedListBox1.Items.Add(new Yaku("Terminal in each set", 3)); 
    checkedListBox1.Items.Add(new Yaku("Three closed triplets", 3)); 
} 

et additionnez les scores comme ceci:

private void button1_Click(object sender, EventArgs e) 
{ 
    int score = checkedListBox1.CheckedItems.OfType<Yaku>().Sum(item => item.Han); 
    MessageBox.Show(score.ToString()); 
} 
+0

Cela obtient mon upvote. La seule autre réponse qui semble reconnaître une variation dans les scores (un soupir de soulagement). Bien que je soutiendrais que pour des raisons de maintenabilité, les objets yaku étaient conservés dans une liste quelque part s'ils devaient être réutilisés. Ce n'est pas clair de voir à partir de votre 'int []' quel score appartient à quel 'yaku'. –

+0

@JayMee D'accord, et je préfèrerais vraiment stocker un objet avec chaque élément de la liste (en utilisant la propriété '.Tag') qui inclut le score, alors vous utiliseriez juste cela pour obtenir le score à ajouter. Mais je pense que cela sortirait du cadre de cette question. –

+0

Bien! Je n'étais pas au courant de '.Tag'. –

-3

Mettez les indices de cases à cocher dans une liste/tableau:

using System.Linq; 

... 
var checkboxIndices = { 0, 2, 17 }; 
x += checkboxIndices.Count(index => 
     checkedListBox1.GetItemCheckState(index) == CheckState.Checked); 

Edit: Soupir, je pensais qu'il était évident, mais ici est la même chose avec plus de détails:

class Yaku 
    { 
     public Yaku(List<int> indices, int han) 
     { 
      Indices = indices; 
      HanValue = han; 
     } 
     public List<int> Indices; 
     public int HanValue; 
     public int ComputeValue(CheckedListBox checkedListBox) 
     { 
      return HanValue * Indices.Count(index => 
       checkedListBox.GetItemCheckState(index) == CheckState.Checked); 
     } 
    } 

    ... 
    var yakus = [ 
     new Yaku({0, 2, 17 }, 1), 
     new Yaku({1}, 2) 
     ... 
    ]; 
    var totalYakuValue = yakus.Aggregate(yaku => yaku.ComputeValue()); 
+0

Les index ne peuvent pas être codés en dur dans ce tableau. – niksofteng

+0

Et pourquoi ça? –

+0

Vous aussi, vous manquez le point de son exigence. Lisez les commentaires sur le PO. –

-1

Je pense que les autres semblent avoir manqué est que chaque élément aura un "han" différent, que vous devez utiliser pour incrémenter x par.

En supposant que vous avez une classe à partir de laquelle vous créez votre liste:

public class Yaku 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
    public int Han { get; set; } 
} 

Vous pouvez parcourir votre CheckboxList et renvoyer au List<Yaku> pour obtenir le Han:

foreach(ListItem item in checkedListBox1.Items) 
{ 
     if (item.Selected) 
      x += yakuList.Single(o => o.ID.Equals(item.Value)).Han; 
} 

NOTE: Nous comparez la valeur de chaque article au ID des articles de la liste Yaku, donc lorsque vous créez votre liste de cases à cocher, assurez-vous que le Value de l'élément de la liste de cases à cocher est le I D des Yaku. Excusez mon utilisation de la terminologie yaku, je ne suis pas familier avec le jeu du tout. La prémisse est toujours la même.

+0

@Phpdevpad - c'est "plus simple" parce que c'est faux. Vous n'augmentez pas toujours de '1'. Qu'en est-il lorsque le "han" est différent pour les éléments sélectionnés? Lisez les commentaires de OP (comme je l'ai déjà dit deux fois). –

+0

@Phpdevpad Non vous n'avez pas, vous avez simplement enveloppé une boucle autour du code qu'il a déjà. Pourquoi testez-vous même 3 fois? Cela n'atteindra même pas les 2 autres conditions du 'si '. Vous avez fait le code pire que l'OP avait déjà. –

+0

donc dans votre liste vous voulez que l'uer insère 52 enregistrements !!! Cela ne semble pas raisonnable. –