2010-01-10 7 views
6

Usando .NET MicroFramework que es una versión realmente cortada de C#. Por ejemplo, System.String apenas tiene algunos de los artículos que hemos disfrutado a lo largo de los años.¿Cómo se dividiría por r n si String.Split (String []) no existiera?

Necesito dividir un documento de texto en líneas, lo que significa dividir por \ r \ n. Sin embargo, String.Split solo proporciona una división por char, no por cadena.

¿Cómo puedo dividir un documento en líneas de una manera eficiente (por ejemplo, no bucle locamente a través de cada char en el documento)?

P.S. A System.String también le falta un método Replace, por lo que no funcionará.
P.P.S. Regex tampoco es parte de MicroFramework.

+6

No es una versión reducida de C#; es una versión reducida de .NET Framework. –

Respuesta

12

Usted puede hacer

string[] lines = doc.Split('\n'); 
for (int i = 0; i < lines.Length; i+= 1) 
    lines[i] = lines[i].Trim(); 

Suponiendo que el mF apoya Trim() en absoluto. Trim() eliminará todos los espacios en blanco, que podrían ser útiles. utilizar de otro modo TrimEnd('\r')

+0

Sí, esto hace el truco y mantiene la mayoría de las características de rendimiento. Gracias. Muy inteligente. – AngryHacker

+0

Estaba a punto de sugerir algo como esto - vencerme al golpe. Es posible que necesite recombinar cadenas (teóricamente) si '\ n' no siempre va precedido de '\ r' en la entrada. – LBushkin

2

¿Qué hay de:

string path = "yourfile.txt"; 
string[] lines = File.ReadAllLines(path); 

O

string content = File.ReadAllText(path); 
string[] lines = content.Split(
    Environment.NewLine.ToCharArray(), 
    StringSplitOptions.RemoveEmptyEntries); 

readind que .NET Micro Framework 3.0, este código puede funcionar:

string line = String.Empty; 
StreamReader reader = new StreamReader(path); 
while ((line = reader.ReadLine()) != null) 
{ 
    // do stuff 
} 
+0

Se divide por ambos elementos en el CharArray por separado. Por lo tanto, obtendrá un montón de resultados vacíos además de resultados legítimos. – AngryHacker

+0

@AngryHacker: RemoveEmptyEntries debería tratar con ellos; –

+0

File.ReadAllLines tampoco es compatible. – AngryHacker

6

me habría bucle a través de cada caracter en el documento, ya que hay claramente requerido. ¿Cómo crees que funciona String.Split? Sin embargo, trataría de hacerlo golpeando a cada personaje una vez.

Mantenga una lista de cadenas encontradas hasta el momento. Use IndexOf repetidamente, pasando el desplazamiento actual a la cadena (es decir, la coincidencia anterior + 2).

+0

Es cierto, pero la implementación .NET completa de Split (cadena []) utiliza punteros y código inseguro para lograr el rendimiento que lo hace. De lo contrario, simplemente copiaría el código. Estoy trabajando en un chip de muy bajo consumo y esperaba algo extremadamente inteligente. – AngryHacker

+1

Si solo está dividiendo por una sola cadena de delimitador, y el delimitador tiene más de 3 caracteres, puede obtener un mejor rendimiento utilizando una de las variantes del algoritmo de búsqueda de Boyer-Moore. No es que ayude al problema del póster, en este caso. http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm – LBushkin

3

Cómo puedo dividir un documento en líneas de una manera eficiente (por ejemplo, no locamente bucle a través de cada caracter en el doc)?

¿Cómo crees que funciona el Split incorporado?

Simplemente vuelva a implementarlo usted mismo como método de extensión.

0

Esto puede ayudar de alguna escenario:

StreamReader reader = new StreamReader(file);  
string _Line = reader.ReadToEnd(); 
string IntMediateLine = string.Empty; 
IntMediateLine = _Line.Replace("entersign", ""); 
string[] ArrayLineSpliter = IntMediateLine.Split('any specail chaarater'); 
+0

¿En qué escenarios? Puede proporcionar algunos detalles, por favor. –

0

Si desea una compatible con la función dividida MicroFramework que funciona durante todo un cadena de caracteres, aquí hay uno que hace el truco , similar a la versión de frameworks normales utilizando StringSplitOptions.None:

private static string[] Split(string s, string delim) 
    { 
     if (s == null) throw new NullReferenceException(); 

     // Declarations 
     var strings = new ArrayList(); 
     var start = 0; 

     // Tokenize 
     if (delim != null && delim != "") 
     { 
      int i; 
      while ((i = s.IndexOf(delim, start)) != -1) 
      { 
       strings.Add(s.Substring(start, i - start)); 
       start = i + delim.Length; 
      } 
     } 

     // Append left over 
     strings.Add(s.Substring(start)); 

     return (string[]) strings.ToArray(typeof(string)); 
    } 
+0

Pensé en convertir esto en un Método de extensión según [esta posibilidad] (https://stackoverflow.com/questions/14344668/extension-methods-with-net-micro-framework) – vGHazard

Cuestiones relacionadas