Выполните итерацию по файлам и выберите ближайший к моему параметру - PullRequest
0 голосов
/ 06 мая 2011

Я бы хотел перебрать папку, которая может содержать файлы со следующими именами:

1.xml
2.xml
3.xml
4.xml
и т.д ..

Теперь я хотел бы выбрать файл, который ближе всего к номеру, который я назначаю поисковому методу, но не выше его.

например. в папке 1, 3, 5 и 8.xml, мой параметр равен 6, я вижу, что 6 там нет, 8 слишком велико, тогда выберите 5!

Я уже сталкивался с Directory.GetFiles -методом, но, поскольку он возвращает весь путь, это будет довольно неприятное сокращение и сравнение строк, есть ли более элегантное решение моей проблемы? Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 06 мая 2011

Быстро и грязно, без проверки, чтобы гарантировать, что имена файлов действительно могут быть проанализированы с числами (то есть, если существуют не числовые файлы 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()
2 голосов
/ 06 мая 2011

Я явно медленнее, чем все остальные :), но я подумал, что опубликую это, так как написал.

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();
    }
}
2 голосов
/ 06 мая 2011

Вы можете использовать Directory.GetFiles в сочетании с Path.GetFileNameWithoutExtension (path) .

Итак, что-то вроде:

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

One 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();
...