Caractère partagé le plus fiable

Mettre à jour

Si vous deviez utiliser un seul caractère sur une méthode fractionnée, quel caractère serait le plus fiable?

Définition de fiable: un caractère divisé qui ne fait pas partie des sous-chaînes individuelles en cours de division.

Nous utilisons actuellement

 public const char Separator = ((char)007); 

Je pense que c’est le bip sonore, si je ne me trompe pas.

Mis à part 0x0, qui peut ne pas être disponible (à cause des chaînes terminées par NULL, par exemple), les caractères de contrôle ASCII entre 0x1 et 0x1f sont de bons candidats. Les caractères ASCII 0x1c-0x1f sont même conçus pour une telle chose et portent les noms File Separator , Group Separator , Record Separator , Unit Separator . Cependant, ils sont interdits dans les formats de transport tels que XML .

Dans ce cas, les caractères des points de code à usage privé Unicode peuvent être utilisés.

Une dernière option consisterait à utiliser une stratégie d’échappement, de sorte que le caractère de séparation puisse être saisi d’une manière ou d’une autre. Cependant, cela complique beaucoup la tâche et vous ne pouvez plus utiliser Ssortingng.Split.

Vous pouvez utiliser en toute sécurité n’importe quel caractère que vous aimez en tant que délimiteur, si vous échappez à la chaîne pour que vous sachiez qu’elle ne contient pas ce caractère.

Choisissons par exemple le caractère ‘a’ comme délimiteur. (J’ai intentionnellement choisi un personnage habituel pour montrer que n’importe quel personnage peut être utilisé.)

Utilisez le caractère ‘b’ comme code d’échappement. Nous remplaçons toute occurrence de ‘a’ par ‘b1’ et toute occurrence de ‘b’ par ‘b2’:

 private static ssortingng Escape(ssortingng s) { return s.Replace("b", "b2").Replace("a", "b1"); } 

Maintenant, la chaîne ne contient aucun caractère “a”, vous pouvez donc assembler plusieurs de ces chaînes:

 ssortingng msg = Escape("banana") + "a" + Escape("aardvark") + "a" + Escape("bark"); 

La chaîne ressemble maintenant à ceci:

 b2b1nb1nb1ab1b1rdvb1rkab2b1rk 

Maintenant, vous pouvez diviser la chaîne sur ‘a’ et obtenir les parties individuelles:

 b2b1nb1nb1 b1b1rdvb1rk b2b1rk 

Pour décoder les pièces que vous faites le remplacement en arrière:

 private static ssortingng Unescape(ssortingng s) { return s.Replace("b1", "a").Replace("b2", "b"); } 

Ainsi, la division de la chaîne et le décodage des pièces se font comme ceci:

 ssortingng[] parts = msg.split('a'); for (int i = 0; i < parts.length; i++) { parts[i] = Unescape(parts[i]); } 

Ou en utilisant LINQ:

 ssortingng[] parts = msg.Split('a').Select(Unescape).ToArray(); 

Si vous choisissez un caractère moins commun comme délimiteur, il y a bien sûr moins d'occurrences à échapper. Le fait est que la méthode s'assure que le caractère est sûr à utiliser comme délimiteur sans faire aucune hypothèse sur les caractères existant dans les données que vous voulez mettre dans la chaîne.

Je préfère habituellement un ‘ | ‘symbole comme caractère divisé. Si vous n’êtes pas sûr de ce que l’utilisateur entre dans le texte, vous pouvez empêcher l’utilisateur d’entrer des caractères spéciaux et vous pouvez choisir parmi ces caractères, le caractère divisé.

\ 0 est un bon caractère divisé. C’est assez difficile (impossible?) D’entrer du clavier et cela a un sens logique.

\ n est un autre bon candidat dans certains contextes.

Et bien sûr, les chaînes de

Cela dépend de ce que vous divisez.

Dans la plupart des cas, il est préférable d’utiliser des caractères divisés assez couramment utilisés, par exemple

valeur, valeur, valeur

valeur | valeur | valeur

clé = valeur; clé = valeur;

clé: valeur; clé: valeur;

Vous pouvez utiliser les identifiants entre guillemets avec des virgules:

“valeur”, “valeur”, “valeur avec, intérieur”, “valeur”

J’ai tendance à utiliser , abord, puis | , alors si je ne peux pas les utiliser, j’utilise le caractère section-break §

Notez que vous pouvez taper n’importe quel caractère ASCII avec ALT+number (sur le pavé numérique uniquement), donc § est ALT+21

Il y a des surcharges de Ssortingng.Split qui prennent des séparateurs de chaînes …

Je dirais personnellement que cela dépend entièrement de la situation; si vous écrivez un simple système de discussion TCP / IP, vous ne devriez évidemment pas utiliser \ n comme division. Mais “\ 0” est un bon caractère à utiliser car les utilisateurs ne peuvent jamais utilise le!

Tout d’abord, en C # (ou .NET), vous pouvez utiliser plusieurs caractères fractionnés en une seule opération.

Ssortingng.Split Method (Char[]) Référence ici
Un tableau de caractères Unicode qui délimitent les sous-chaînes dans cette instance, un tableau vide ne contenant aucun délimiteur ou une référence null (Nothing en Visual Basic).

À mon avis, il n’y a pas de personnage partagé le plus fiable, mais certains sont plus adaptés que d’autres.

Les caractères fractionnés les plus répandus, comme tab, virgule et pipe, permettent de visualiser la chaîne / ligne non fractionnée.

Si ce n’est que pour le stockage / traitement, les caractères les plus sûrs sont probablement ceux qui sont rarement utilisés ou ceux qui ne sont pas facilement saisis au clavier.

Cela dépend aussi du contexte d’utilisation. Par exemple, si vous vous attendez à ce que les données contiennent des adresses électroniques, “@” est un non non.

Disons que nous devions en choisir un parmi le jeu ASCII . Il y a pas mal de choix. Par exemple “` “,” ^ “et certains des caractères non imprimables. Méfiez-vous de certains caractères cependant, tous ne conviennent pas. Par exemple, 0x00 peut avoir un effet négatif sur certains systèmes.

Cela dépend beaucoup du contexte dans lequel il est utilisé. Si vous parlez d’un caractère de délimitation très général, je ne pense pas qu’il y ait une réponse unique.

Je trouve que le caractère null ASCII ‘\ 0’ est souvent un bon candidat, ou vous pouvez aller avec l’idée de nitzmahone et utiliser plus d’un caractère, alors ça peut être aussi fou que vous voulez.

Vous pouvez également parsingr l’entrée et échapper à toute instance de votre caractère de délimitation.

“|” Le signe de tuyau est principalement utilisé lorsque vous transmettez des arguments .. à la méthode acceptant uniquement un paramètre de type chaîne. Ceci est largement utilisé dans les SP SQL Server, où vous devez passer un tableau en tant que paramètre. La plupart du temps, cela dépend de la situation où vous en avez besoin.