dividir una cadena en una matriz con un número específico de elementos, C#

Tengo una cadena que consiste en una cantidad de términos ordenados separados por líneas (\n) como se muestra en el siguiente ejemplo: (nota, la cadena que tengo es un elemento de una matriz de cadenas)

term 1
term 2
.......
.......
term n

Quiero dividir un número específico de términos, digamos (1000) solamente y descartar el resto de los términos. Estoy intentando el siguiente código:

string[] training = traindocs[tr].Trim().Split('\n');
                List <string> trainterms = new List<string>();
                for (int i = 0; i < 1000; i++)
                {
                    if (i >= training.Length)
                        break;
                    trainterms.Add(training[i].Trim().Split('\t')[0]);
                } 

¿Puedo realizar esta operación sin usar List o cualquier otra estructura de datos? ¿Me refiero a simplemente extraer el número específico de los términos en el Array (entrenamiento) directamente? gracias de antemano.

preguntado el 04 de julio de 12 a las 09:07

3 Respuestas

¿Qué hay de LINQ? Él .Tomar() el método de extensión parece ajustarse a sus necesidades:

List<string> trainterms = traindocs[tr].Trim().Split('\n').Take(1000).ToList();

Respondido 04 Jul 12, 09:07

Según MSDN puede usar una versión sobrecargada del split método.

public string[] Split( char[] separator, int count, StringSplitOptions options )

parámetros

separator Tipo: System.Char[] Una matriz de caracteres Unicode que delimitan las subcadenas en esta cadena, una matriz vacía que no contiene delimitadores o es nula.

count Tipo: System.Int32 El número máximo de subcadenas a devolver.

opciones Tipo: System.StringSplitOptions StringSplitOptions.RemoveEmptyEntries para omitir elementos de matriz vacíos de la matriz devuelta; o StringSplitOptions.None para incluir elementos de matriz vacíos en la matriz devuelta.

Valor de retorno

Tipo: System.String[] Una matriz cuyos elementos contienen las subcadenas de esta cadena que están delimitadas por uno o más caracteres en el separador. Para obtener más información, consulte la sección Comentarios.

Entonces algo así:

String str = "A,B,C,D,E,F,G,H,I";
            String[] str2 = str.Split(new Char[]{','}, 5, StringSplitOptions.RemoveEmptyEntries);
            System.Console.WriteLine(str2.Length);
            System.Console.Read();

Imprimiría: 5

EDITAR: Tras una mayor investigación, parece que el count El parámetro solo indica cuándo se detiene la división. El resto de la cadena se mantendrá en el último elemento.

Entonces, el código anterior arrojaría el siguiente resultado:[0] = A, [1] = B, [2] = C, [3] = D, [4] = E,F,G,H,I, que no es algo que pareces estar buscando.

Para arreglar esto, tendrías que hacer algo así:

String str = "A\nB\nC\nD\nE\nF\nG\nH\nI";
            List<String> myList = str.Split(new Char[]{'\n'}, 5, StringSplitOptions.RemoveEmptyEntries).ToList<String>();
            myList[myList.Count - 1] = myList[myList.Count - 1].Split(new Char[] { '\n' })[0];
            System.Console.WriteLine(myList.Count);
            foreach (String str1 in myList)
            {
                System.Console.WriteLine(str1);
            }
            System.Console.Read();

El código anterior solo conservará los primeros 5 (en su caso, 1000) elementos. Por lo tanto, creo que la solución de Darin podría ser más limpia, por así decirlo.

Respondido 04 Jul 12, 09:07

¿Podría explicar algo más de acuerdo con la publicación original? gracias - FSm

@Qaesar: he actualizado mi respuesta. Probé el código y publiqué lo que encontré. Creo que podría ser una buena idea no eliminar la publicación solo porque esta pregunta demuestra un caso de tradicional (si lo desea) la programación en comparación con la más, LinQ reciente. - npinti

Si desea la forma más eficiente (más rápida), debe usar la sobrecarga de String.Split, pasando el número total de artículos requeridos.

Si quiere una manera fácil, use LINQ.

Respondido 04 Jul 12, 09:07

@ Tilak, ¿hay alguna diferencia entre las dos formas con respecto al tiempo que consume? gracias. - FSm

Sobrecarga de String.Split, usa solo un bucle. LINQ usará 2 bucles, uno para String.Split, otro para Take. Habrá diferencia (pero no notable). - Tilak

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.