2014-06-09 3 views
-5

Bonne journée, j'ai posé cette question avant mais je n'étais pas spécifique pour ce que je m'excuse. Je fais un simple jeu d'échecs windForms en utilisant des boîtes d'image comme chaque cellule. Selon les règles, le Roi ne peut pas bouger si la cellule est visée par une pièce ennemie. Pour implémenter cette règle, j'utilise la propriété pictureBox.Tag et lui assigne une chaîne. Si une pièce le cible, j'utilise pictureBox1.Tag += "D" D comme Danger. Donc, si deux pièces le ciblent, le Tag deviendra "DD". Ma question est la suivante - Comment puis-je supprimer un seul 'D' de ma chaîne? Puis-je utiliser l'opérateur -= ou quelque chose de similaire?Comment supprimer un caractère d'une chaîne de caractères?

+0

Jetez un oeil à la méthode SubString. – Transcendent

+1

Conservez-vous une grande quantité d'informations méta dans ces chaînes ou est-ce juste le D? Si c'est juste le D alors faites un = pas a + =. – stonemetal

+0

Je suis en train d'apprendre la programmation, j'ai cherché sur le web et je n'ai pas trouvé ce dont j'avais besoin. Si je pose une question évidente, donnez-moi une sorte de réponse ou au moins un lien vers une réponse. – user3552161

Répondre

0

Je pense que cela résoudrait votre problème

public void Remove (PictureBox pb){ 
    if (pb.Tag.ToString().Length > 1) { 
     // Greater than 1 because we need to keep one D in case of DD, 
     String temp = pb.Tag.ToString(); 
     pb.Tag = temp.Substring(0, temp.Length - 2); 
    } 
    else 
     pb.Tag = "D"; 
     // Tag equals D because if there is only one D, it won't be deleted 
} 
1

En supposant:

string a = "ABCDEFG"; 

Pour enlever le premier 'D':

a = a.Remove(a.IndexOf('D'), 1); 

Pour supprimer tous les « D'de

a = new string(a.Where(c => c != 'D').ToArray()); 

Bien que je recommande la recherche à l'approche orientée objet. Ensuite, vous pouvez facilement stocker des références aux véritables joueurs qui ciblent un spot, donc facile à modifier (pas besoin de recalculer).

+0

Est-ce que cela ne supprimerait pas tous les D? Je recommanderais 'Distinct'. – gunr2171

+0

@ gunr2171: Vous avez raison, j'ai mis à jour ma réponse - ajouté une autre approche. – Neolisk

0

utiliser simplement la méthode Replace, en remplacement de votre personnage (comme une chaîne) avec une chaîne vide:

string s = "Daddy comes back"; 
s = s.Replace("D", string.Empty); // Replace ALL D' 
Console.WriteLine(s); 

Sinon, si vous connaissez déjà l'index des caractères à supprimer, ou si vous avez besoin supprimer un seul caractère, pensez à utiliser les méthodes Substring.

s = s.Substring(i, i+1); // Remove the character at position i 

Notez que C# string est immuable: dans les deux cas, une nouvelle instance de chaîne est retournée.

+0

Cela ne supprimera-t-il pas tous les 'D' de la chaîne? – user3552161

+0

Oui, il le ferait. Utilisez Substring pour supprimer seulement un caractère spécifique à une position donnée, voir mon édition – quantdev

0

Vous pouvez utiliser une expression régulière pour spécifier pour supprimer une seule instance d'un personnage:

Regex regex = new Regex(Regex.Escape("D")); 
string output = regex.Replace("ABCDDEFG", string.Empty, 1); 
+1

Avec tout le respect dû, je pense que l'utilisation d'expressions régulières est une exagération pour cette tâche particulière. – Neolisk

+1

J'espère juste qu'il ne va pas dans le code sensible à la performance – quantdev

+0

Je respecte vos commentaires les gars, bien que dans le cas de la défense: @Neolisk, je suppose que c'est une question d'opinion. Je pense que c'est à peu près aussi simple que n'importe quelle opération regex peut être, et comme le PO dit qu'il apprend, c'est un moyen simple d'être introduit dans un outil utile. Quantdev, je ne pense pas qu'il y ait un problème de performance appréciable ici, surtout compte tenu de la nature du programme décrit par le PO. En tout cas, des commentaires équitables à la fois. – PulseLab

1

Bien qu'il y ait des moyens Ware faire ce que vous » réessayer de faire, ce que vous voulez vraiment faire est de manipuler la chaîne de fossé, et d'utiliser autre chose. Par exemple, créez une classe entière pour cette méta-information carrée. Quelque chose comme

public class SquareInfo 
{ 
    public int Danger; //the number of pieces that can move to this square. 
    //... Any other information about the square you want. 
} 

Ensuite, vous pouvez récupérer le tag comme:

var myInfo = (SquareInfo)myBox.Tag; 

if (myInfo.Danger > 2) 
{ 
//do something 
} 

Et ainsi de suite.

Questions connexes