2009-12-10 14 views
45

actualizaciónpersonaje dividido más fiable

Si se vieron obligados a utilizar un solo Char en un método de división, que Char sería el más fiable?

Definición de confiable: un carácter dividido que no forma parte de las subcadenas individuales que se dividen.

+0

¿Hay alguna razón por la que etiquetó esto con * C# *? No veo ninguna razón por la cual esto deba estar relacionado con el lenguaje. –

+1

Al realizar una operación de cadena en .NET WinForm, '\ 0' es un carácter terminador cuando se trata de controles de formulario. –

Respuesta

50

Actualmente usamos

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

Creo que este es el sonido de aviso, si no estoy equivocado.

+2

así que supongo que con suerte nunca debería aparecer en mensajes de excepción de try y catch blocks? –

+0

No estoy seguro de si esta es la mejor respuesta, pero fue la más original de lo que me dieron. –

+7

El nombre es Beep. Consola Beep. ;) – RCIX

8

por lo general prefiero un "| 'símbolo como el carácter dividido. Si no está seguro de lo que el usuario ingresa en el texto, puede restringir que el usuario ingrese algunos caracteres especiales y puede elegir entre esos caracteres, el carácter dividido.

1

Depende mucho del contexto en el que se utiliza. Si estás hablando de un personaje delimitador muy general, entonces no creo que haya una respuesta única para todos.

Creo que el carácter nulo ASCII '\ 0' es a menudo un buen candidato, o puede ir con la idea de nitzmahone y usar más de un personaje, entonces puede ser tan loco como desee.

Como alternativa, puede analizar la entrada y escapar de cualquier instancia de su carácter de delimitación.

5

\ 0 es un buen personaje dividido. Es bastante difícil (¿imposible?) Ingresar desde el teclado y tiene un sentido lógico.

\ n es otro buen candidato en algunos contextos.

Y, por supuesto, las cadenas .Net son unicode, no es necesario que se limite a las primeras 255. Siempre puede usar una letra mongola rara o algún símbolo Unicode reservado o no usado.

+0

¿puede terminar en mensajes de texto ex? –

+0

Depende de quién arroje una excepción. \ n en realidad puede ocurrir. ¡Pero puede usar algún raro carácter Unicode! –

2

Yo personalmente diría que depende de la situación por completo; Si está escribiendo un simple sistema de chat TCP/IP, obviamente no debería usar '\ n' como división. Pero '\ 0' es un buen caracter para usar debido al hecho de que los usuarios no pueden usarlo!

5

Depende de lo que esté dividiendo.

En la mayoría de los casos lo mejor es utilizar caracteres de división que se utilizan con bastante frecuencia, por ejemplo

valor, valor, valor

valor | valor | valor

clave

= valor; clave = valor;

clave: valor; clave: valor;

Puede utilizar identificadores entre comillas muy bien con comas:

"valor", "valor", "valor con, en el interior", "valor"

que tienden a utilizar , primero, luego |, luego, si no puedo usar ninguno de ellos, uso el carácter de corte de sección §

Tenga en cuenta que puede escribir cualquier carácter ASCII con ALT+number (en el teclado numérico solamente), por lo § es ALT+21

19

Aparte de 0x0, que puede no estar disponible (debido a las cadenas terminadas en cero, por ejemplo), los caracteres de control ASCII entre 0x1 y 0x1f son buenos candidatos. Los caracteres ASCII-0x1C 0x1f incluso están diseñados para tal cosa y tienen los nombres de archivo separador , Grupo Separador, separador de registros de, separador de unidades. Sin embargo, están prohibidos en formatos de transporte como XML.

En ese caso, se pueden usar los caracteres del unicode private use code points.

Una última opción sería usar una estrategia de escape, de modo que el carácter de separación se pueda ingresar de alguna manera de todos modos. Sin embargo, esto complica bastante la tarea y ya no puedes usar String.Split.

+1

Tenga en cuenta que la mayoría de los 'caracteres de control entre 0x1 y 0x1f' no son XML serializables. – wqw

2

En primer lugar, en C# (o .NET), puede usar más de un carácter dividido en una operación dividida.

String.Split Method (Char[])Reference here
Un conjunto de caracteres Unicode que delimitan las subcadenas en este caso, una matriz vacía que no contiene delimitadores, o referencia null (Nothing en Visual Basic).

En mi opinión, no existe el carácter dividido MÁS confiable, sin embargo, algunos son más adecuados que otros.

Los caracteres de división populares como tabulación, coma, tubería son buenos para ver la cadena/línea no dividida.

Si solo es para almacenar/procesar, los caracteres más seguros son los que rara vez se usan o los que no se ingresan fácilmente desde el teclado.

También depende del contexto de uso. P.ej. Si espera que los datos contengan direcciones de correo electrónico, "@" es un no no.

Digamos que debemos elegir uno del ASCII set. Hay un gran número para elegir. P.ej. "` ","^"y algunos de los caracteres no imprimibles. Sin embargo, ten cuidado con algunos personajes, no todos son adecuados. P.ej. 0x00 podría tener un efecto adverso en algún sistema.

0

"|" El signo de tubería se usa principalmente cuando se pasan argumentos ... al método que acepta solo un parámetro de tipo de cadena. Este es ampliamente utilizado en los SP de SQL Server, donde debe pasar una matriz como parámetro. Bueno, en su mayoría depende de la situación donde lo necesite.

15

Puede usar de forma segura el carácter que desee como delimitador, si escapa de la cadena para que sepa que no contiene ese carácter.

Vamos, por ejemplo, a elegir el carácter 'a' como delimitador. (Escogí intencionalmente un carácter habitual para mostrar que se puede usar cualquier carácter).

Usa el carácter 'b' como código de escape. Reemplazamos cualquier ocurrencia de 'a' con 'B1' y cualquier ocurrencia de 'b' con 'b2':

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

Ahora, la cadena no contiene ningún 'a' caracteres, lo que puede poner varios de esas cadenas juntas:

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

la cadena ahora se ve así:

b2b1nb1nb1ab1b1rdvb1rkab2b1rk 

ahora se puede dividir la cadena en 'a' y conseguir las piezas individuales:

b2b1nb1nb1 
b1b1rdvb1rk 
b2b1rk 

para decodificar las partes que la sustitución hacia atrás:

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

Así que la división de la cuerda y unencoding las partes se hace así:

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

O usando LINQ:

string[] parts = msg.Split('a').Select<string,string>(Unescape).ToArray(); 

Si elige un carácter menos común como delimitador, hay, por supuesto, menos apariciones eso se escapará El punto es que el método se asegura de que el carácter sea seguro de usar como delimitador sin hacer suposiciones sobre qué caracteres existen en los datos que desea poner en la cadena.

+1

el problema que veo con este método, es decir, tu cadena contiene b1 en la cadena original, por ejemplo, "punto b1: una manzana", ahora tendrías "punto b1: b1n b1pple" después de escapar, ahora cuando salgas de escena lo harías tener "punto a: una manzana" - por lo que esto destruye por completo su método. Bien podría haber empezado con un personaje oscuro en primer lugar, ¿no crees? –

+6

@JL: Estás equivocado. Después de escapar de la cadena, aparece el "punto b21: b1n b1pple". Unescaping da la cadena original. La razón por la que elegí un personaje común es para demostrar que el método es completamente seguro. Por lo general, debe elegir un carácter menos utilizado para minimizar el número de caracteres que debe escaparse. – Guffa

Cuestiones relacionadas