【问题标题】:Iterate through Files and pick the closest to my parameter遍历文件并选择最接近我的参数
【发布时间】:2011-05-06 08:23:24
【问题描述】:

我想遍历一个文件夹,该文件夹可以包含具有以下名称的文件:

1.xml
2.xml
3.xml
4.xml
等..

现在我想选择最接近我分配给搜索方法但不高于它的数字的文件。

例如文件夹中分别是1、3、5和8.xml,我的参数是6,我看到6不存在,8太高了,那就选5吧!

我已经遇到过Directory.GetFiles-Method,但由于它返回整个路径,这将是一个相当讨厌的字符串切割和比较,是否有更优雅的解决方案来解决我的问题?提前致谢!

【问题讨论】:

    标签: c# asp.net directory iteration


    【解决方案1】:

    快速而肮脏,没有检查以确保文件名实际上可以解析为数字(即,如果存在非数字命名的 XML 文件,这将失败)。留给读者作为练习来强化这种方法。

    Directory.GetFiles(@"C:\somePath" , "*.xml")
    .Select(f => new{fn = Path.GetFileNameWithoutExtension(f) , path = f})
    .Select(x => new{fileNum = int.Parse(x.fn) , x.path})
    .OrderBy(x => x.fileNum)
    .TakeWhile(x => x.fileNum <= MYPARAM)
    .Select(x => x.path)
    .LastOrDefault()
    

    【讨论】:

    • 你的意思是不是第 3 行的 path = x.fn
    • 不,但有一个错误。已更正。
    • 我喜欢这个解决方案,因为它返回完整路径,而不仅仅是文件编号。在大多数情况下可能更有用:)
    【解决方案2】:

    您可以将Directory.GetFilesPath.GetFileNameWithoutExtension(path) 结合使用。

    所以,类似:

    foreach (file in Directory.GetFiles("c:\\temp")) 
    {
        int myInt = Int32.Parse(Path.GetFileNameWithoutExtension(file));
    }
    

    解决整个问题的一个 LINQ-y 解决方案可能是:

    int maxFileId = 2;
    int myFileNumber = Directory.GetFiles(@"C:\TEMP1\test\EnvVarTest\Testfiles")
        .Select(file => Int32.Parse(Path.GetFileNameWithoutExtension(file)))
        .Where(i => i <= maxFileId)
        .Max();
    

    【讨论】:

    • 谢谢,您的似乎是最快的解决方案!
    【解决方案3】:

    我的打字速度显然比其他人慢 :) 但我想我会发布它,因为我已经写了它。

    class Program
    {
        public class NumberedXmlFile
        {
            public NumberedXmlFile(string fullPath)
            {
                FullPath = fullPath;
            }
            public string FullPath { get; set; }
            public int FileNumber
            {
                get
                {
                    string file = Path.GetFileNameWithoutExtension(FullPath);
    
                    return Convert.ToInt32(file);
                }
            }
        }
    
        static void Main(string[] args)
        {
            const int targetFileNameNumber = 4;
            const string directoryPathContainingFiles = @"C:\temp";
    
            IEnumerable<NumberedXmlFile> numberedXmlFiles = Directory.GetFiles(directoryPathContainingFiles).Select(f => new NumberedXmlFile(f));
    
            NumberedXmlFile theFileIamLookingFor = numberedXmlFiles.OrderBy(f => Math.Abs(f.FileNumber - targetFileNameNumber)).FirstOrDefault();
        }
    }
    

    【讨论】:

    • 感谢您的解决方案,也是一个不错的方法!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多