web-dev-qa-db-fra.com

C # suppression de chaînes de fin de chaîne

J'ai un tableau de chaînes:

string[] remove = { "a", "am", "p", "pm" };

Et j'ai une zone de texte dans laquelle un utilisateur entre du texte. S'ils tapent une chaîne dans le tableau remove à la fin du texte dans la zone de texte, elle doit être supprimée. Quelle est la manière la plus simple de faire ça?

EDIT Pour clarifier, je fais un analyseur de temps. Lorsque vous donnez à la fonction une chaîne, elle fait de son mieux pour l'analyser dans ce format: 08:14pm J'ai une zone de texte pour le tester. Lorsque le focus quitte la zone de texte, j'ai besoin d'obtenir le texte sans le suffixe am/pm/a/p pour pouvoir analyser le segment uniquement numérique.

35
Entity
string[] remove = { "a", "am", "p", "pm" };
string inputText = "blalahpm";

foreach (string item in remove)
    if (inputText.EndsWith(item))
    {
        inputText = inputText.Substring(0, inputText.LastIndexOf(item));
        break; //only allow one match at most
    }
70
BrokenGlass
foreach (string suffix in remove)
{
    if (yourString.EndsWith(suffix))
    {
        yourString = yourString.Remove(yourString.Length - suffix.Length);
        break;
    }
}
16
LukeH

Je pense que la solution de BrokenGlass est une bonne solution, mais personnellement, je préférerais créer trois méthodes distinctes permettant à l'utilisateur de couper uniquement le début, la fin ou les deux.

Si ces dérangements devaient être beaucoup utilisés, je les créerais dans une classe d'assistance et/ou comme méthodes d'extension; http://msdn.Microsoft.com/en-gb/library/vstudio/bb383977.aspx

public string TrimStart(string inputText, string value, StringComparison comparisonType = StringComparison.CurrentCultureIgnoreCase)
{
    if (!string.IsNullOrEmpty(value))
    { 
        while (!string.IsNullOrEmpty(inputText) && inputText.StartsWith(value, comparisonType))
        {
            inputText = inputText.Substring(value.Length - 1);
        }
    }

    return inputText;
}

public string TrimEnd(string inputText, string value, StringComparison comparisonType = StringComparison.CurrentCultureIgnoreCase)
{
    if (!string.IsNullOrEmpty(value))
    {
        while (!string.IsNullOrEmpty(inputText) && inputText.EndsWith(value, comparisonType))
        {
            inputText = inputText.Substring(0, (inputText.Length - value.Length));
        }
    }

    return inputText;
}

public string Trim(string inputText, string value, StringComparison comparisonType = StringComparison.CurrentCultureIgnoreCase)
{
    return TrimStart(TrimEnd(inputText, value, comparisonType), value, comparisonType);
}

Avec ces méthodes, nous pouvons modifier le code pour parcourir le tableau contenant les chaînes à couper.

var content = "08:00 AM";
var removeList = new [] { "a", "am", "p", "pm" };

for (var i = 0; i < removeList.length; i++)
{
    content = TrimEnd(content, removeList[i]);
}

REMARQUE: ce code pourrait être optimisé davantage, mais fonctionnera tel quel avec une bonne vitesse.

7
Shane Yu

En fonction de votre modification, envisagez d'utiliser les méthodes intégrées DateTime.TryParse ou DateTime.Parse suivies d'un String.Format. Voici un lien vers un bonne ressource sur la mise en forme des chaînes également.

4
Metro Smurf

Vous pouvez alors probablement utiliser DateTime comme type principal.

Utilisation DateTime.TryParse pour lire l'heure de saisie de l'utilisateur. Et utilise DateTime.ToString pour reformater l'heure en utilisant le format dont vous avez besoin.

1
C. Dragon 76

Sonne comme un bon endroit pour regex.

using System.Text.RegularExpressions;

public bool IsValidTime(string thetime)
{
  Regex checktime = new Regex(@"^(20|21|22|23|[01]\d|\d)(([:][0-5]\d){1,2})$");

  return checktime.IsMatch(thetime);
} 

En supposant que vous vouliez du temps au format xx: xx

1
Chris Klepeis
var output = (from x in remove
      where input.EndsWith(x)
     select input.Substring(0, input.Length - x.Length)).FirstOrDefault() ?? input;
1
Jeff Ogata
char[] remove = { 'a', 'p', 'm' };
string s = "8:14pm";

s = s.TrimEnd(remove);
0
ulty4life