2
bool match = Regex.IsMatch(Path.GetFileName(Directory.GetFiles(string.Format(@"C:\apps\{0}\", app), "*.config").ToString()).ToLower(), "loggingconfiguration.config");

我一直在使用下面的代码将配置放入列表中,然后遍历它们中的每一个以查看它们是否与"loggingconfiguration.config"or的文件名匹配"*app*.config."这没有问题,但我不确定这是否是处理的最佳方法设想。

List<string> configFiles = Directory.GetFiles(string.Format(@"C:\apps\{0}\", app), "*.config").ToList<string>();

foreach (var item in configFiles)
{
    if (item.ToLower().Contains("loggingconfiguration.config") || (Path.GetFileName(item.ToLower()).Contains(app)))
    {
        //Do something
    }
}

我想知道是否有一种方法可以通过首先搜索"loggingconfiguration.config"or来减少循环遍历列表的步骤"\*app*.config"。我在顶部的尝试导致 system.string[] 用于 `Path.GetFileName(Directory.GetFiles(string.Format(@"C:\apps{0}\", app), "*.config") 搜索。

4

2 回答 2

1

您可以使用 LINQ 构建一个返回 IEnumerable 的查询,然后对其进行迭代。

var configFiles = Directory.GetFiles(string.Format(@"C:\apps\{0}\", app), "*.config")
    .Where(p => p.ToLower().Contains("loggingconfiguration.config") || Path.GetFileName(p.ToLower()).Contains(app));

foreach (string s in configFiles)
{ 
    //dowork
}

这从您的源代码中隐藏了一些过滤细节,但不一定性能更高。

于 2013-10-21T18:20:53.727 回答
1

假设您使用的是 .NET 4 或更高版本,您可以执行以下操作:

var files = new DirectoryInfo(string.Format(@"C:\apps\{0}\", app))
    .EnumerateFiles("*.config")
    .Where(x=>
        x.Name.Equals("loggingconfiguration.config", StringComparison.OrdinalIgnoreCase) ||
        x.Name.ToUpperInvariant().Contains("APP"));

否则使用GetFiles

var files = new DirectoryInfo(string.Format(@"C:\apps\{0}\", app))
    .GetFiles("*.config")
    .Where(x=>
        x.Name.Equals("loggingconfiguration.config", StringComparison.OrdinalIgnoreCase) ||
        x.Name.ToUpperInvariant().Contains("APP"));

EnumerateFiles那里的信息

于 2013-10-21T18:25:03.263 回答