使用string.format和List<T>.Count()进行动态字符串格式化

8
我需要在工作项目中打印一些PDF文件。是否有一种方法可以提供动态填充,即不使用硬编码在格式字符串中的代码,而是基于列表计数。例如,如果我的列表有1000个元素,我想要这样的格式:
Part_0001_Filename.pdf... Part_1000_Filename.pdf
如果我的列表有500个元素,我希望有这种格式:
Part_001_Filename.pdf... Part_500_Filename.PDF
之所以这样做是因为Windows对文件名的排序方式。它按照从左到右或从右到左的字母顺序进行排序,因此我必须使用前导零,否则文件夹中的排序会出现问题。

实际上,资源管理器实际上使用自然数排序,即使没有前导零,它也会按正确顺序对数字进行排序。 - Joey
1
@Johannes:也许在Vista/7中是这样,但我非常确定XP不是这样工作的。我可能记错了,但我记得当我枚举文件时,它们的顺序与资源管理器显示的不同。 - Chris
1个回答

9
最简单的方法可能是动态构建格式字符串:
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;
}

这可以通过使用LINQ更简单地完成,如果你喜欢的话:
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();
}

@Jon:非常感谢您的帮助。我使用了您的LINQ实现来存储我创建的列表中每个文件的格式字符串。 - Chris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接