2017-04-14 3 views
-4

J'ai des milliers d'enregistrements de temps dans la liste triée. Ils sont au format suivant:Comparaison de chaînes C#

public static string mTimeFormat = "yyyyMMdd_HHmmss_fff"; 

La liste est triée par ordre chronologique. Je récupère une série d'enregistrements de la liste. La gamme résultante est entre 2 fois: t1 et t2 et il fonctionne très bien ...

string t1 = startTime.ToString(mTimeFormat); 
string t2 = endTime.ToString(mTimeFormat); 
List<string> results = fileNameList.FindAll(s => (String.Compare(s, t1, true) > 0) && (String.Compare(s, t2, true) < 0)); 

Maintenant, va encore ma comparaison/récupération travail si j'ajouter un nombre aléatoire à la fin du temps record ... Sur la base de ce que je sais sur les comparaisons de chaînes, cela va casser la comparaison ... Est-ce que ça va?

+5

Um ... Vous ne pouvez pas en ajouter quelques-uns dans un cas de test et vous en rendre compte vous-même? Vous n'avez pas de version test de votre application et quelques données de test? Vous devriez vraiment apprendre à faire des efforts pour trouver les choses vous-même avant de poster. Que se passe-t-il si votre connexion Internet tombe en panne? As-tu juste à t'asseoir et à te tourner les pouces jusqu'à ce qu'il revienne? –

+0

Oh, l'humanité!Comparer 'DateTime's en convertissant en chaînes est dangereux. Les structures 'DateTime' sont directement comparables. Lisez la documentation MSDN. – radarbob

Répondre

1

Très bien, essayons-en un autre. Directement à partir MSDN:

si les deux chaînes de comparaison égal à la fin d'une chaîne, et l'autre chaîne a des caractères restants, la chaîne de caractères restants est plus considéré comme

Par conséquent, la première comparaison (String.Compare(s, t1, true) > 0) retournera vrai si s est plus long que t1 et le reste des caractères sont les mêmes. Sinon, si les deux s et t1 avaient la même longueur, la comparaison ne retournerait vrai que si s est triée plus haut. Cependant, votre seconde comparaison (String.Compare(s, t2, true) < 0) ne devrait pas être affectée.

tl; dr: Oui, en ajoutant un caractère aléatoire peut et finira par briser votre système, mais seulement dans le cas où s et t1 sont exactement les mêmes, sauf pour le caractère aléatoire.

-1

Si vous avez ajouté un caractère aléatoire à la fin des chaînes, ne pourriez-vous pas simplement utiliser String.Substring?

public static string mTimeFormat = "yyyyMMdd_HHmmss_fff"; 

string t1 = startTime.ToString(mTimeFormat); 
string t2 = endTime.ToString(mTimeFormat); 
List<string> results = fileNameList.FindAll(s => (String.Compare(s.Substring(0, mTimeFormat.Length), t1, true) > 0) && (String.Compare(s.Substring(0, mTimeFormat.Length), t2, true) < 0)); 

Cela tronquer les chaînes t1 et t2 si elles sont plus longues que la chaîne de format, contournant ainsi le problème tout à fait.

+0

La question ne pose pas de question sur un kludge pour contourner un problème (jusqu'ici inexistant). C'est une question spécifique sur le comportement du tri. –

1

Je suggère que même si cela fonctionne, c'est la mauvaise approche. La plupart du temps c'est une erreur de mettre des informations supplémentaires dans un champ qui est destiné à être utilisé dans un but différent. Cela rend le code assez fragile et difficile à maintenir. La plupart des développeurs professionnels n'envisageraient jamais de le faire. Au lieu de cela, créez une classe qui incorpore les informations nécessaires - ce qui pour l'instant semble être une valeur de chaîne et un champ d'un certain type pour représenter le nombre aléatoire. Vous avez maintenant la possibilité d'ajouter facilement des fonctionnalités supplémentaires à cette classe au fur et à mesure que les exigences changent.

La classe devrait également implémenter IComparable ou implémenter une classe off de IComparer afin d'utiliser la méthode de comparaison. Voir ce link pour plus d'informations.