2009-06-07 10 views
8

Tengo que imprimir algunos PDF para un proyecto en el trabajo. ¿Hay alguna manera de proporcionar relleno dinámico, IE. no usar un código codificado en la cadena de formato. Pero, en cambio, se basa en el recuento de una lista.formateo de cadenas dinámicas usando string.format y List <T> .Count()

Ej.

Si la lista es larga 1000 elementos, quiero tener esto:

Part_0001_Filename.pdf ... Part_1000_Filename.pdf

Y si la lista es decir 500 elementos de mucho tiempo, yo quiero tener este formato:

Part_001_Filename.pdf ... Part_500_Filename.PDF

La razón de esto es cómo presentar órdenes de Windows nombres. Los ordena alfabéticamente de izquierda a derecha o de derecha a izquierda, así que debo usar el cero inicial, de lo contrario, el orden en la carpeta se arruina.

+0

De hecho, el Explorador de hecho utiliza naturales orden numérico que ordenará los números en el orden correcto incluso sin ceros a la izquierda. – Joey

+1

@Johannes: Tal vez esto sea cierto en Vista/7, pero estoy muy seguro de que no funciona de esa manera en XP. Podría estar equivocado, pero recuerdo que cuando enumeré los archivos, estaban en un orden diferente al que Explorer les mostró. – Chris

Respuesta

8

La forma más sencilla es probablemente la construcción de la cadena de formato dinámicamente también:

static List<string> FormatFileNames(List<string> files) 
{ 
    int width = (files.Count+1).ToString("d").Length; 

    string formatString = "Part_{0:D" + width + "}_{1}.pdf"; 

    List<string> result = new List<string>(); 

    for (int i=0; i < files.Count; i++) 
    { 
     result.Add(string.Format(formatString, i+1, files[i])); 
    } 
    return result; 
} 

Esto se podría hacer un poco más simplemente con LINQ si quieres:

static List<string> FormatFileNames(List<string> files) 
{ 
    int width = (files.Count+1).ToString("d").Length;   
    string formatString = "Part_{0:D" + width + "}_{1}.pdf"; 

    return files.Select((file, index) => 
          string.Format(formatString, index+1, file)) 
       .ToList(); 
} 
+0

@Jon: Muchas gracias por su ayuda. Usé su implementación de LINQ para almacenar la cadena de formato para cada archivo en la lista que he creado. – Chris

Cuestiones relacionadas