FileInfo - Выберите один файл из одного FileInfo[]

У меня есть два массива FileInfo[], и я хочу сравнить файлы с одинаковыми именами по размеру файла и дате последнего изменения. Но как я могу выбрать файл из FileInfo[] с конкретным именем?

Мой код не работает, потому что я не могу использовать FileInfo.Select, чтобы получить новый FileInfo. Есть какие-нибудь подсказки?

        foreach (FileInfo origFile in fiArrOri6)
        {
            FileInfo destFile = fiArrNew6.Select(file => file.Name == origFile.Name);
            if (origFile.Length != destFile.Length || origFile.LastWriteTime != destFile.LastWriteTime)
            {
                //do sth.
            }
        } 

Спасибо за любую помощь:)

Кстати. Любое другое очаровательное решение этой проблемы было бы замечательно. Кстати. #2: есть ли у кого-нибудь хороший учебный материал для FileInfo?

3 ответа

Решение

Вы можете использовать FirstOrDefault, который принимает фильтр

FileInfo destFile = fiArrNew6.FirstOrDefault(file => file.Name == origFile.Name);

Или, если вы не хотите использовать значение по умолчанию, вы можете использовать эквивалентный First, который принимает фильтр

FileInfo destFile = fiArrNew6.First(file => file.Name == origFile.Name);

destFile это не FileInfo, это запрос linq. Измените его имя на что-то вроде fileQuery а потом

var fileQuery = fiArrNew6.Where(file => file.Name == origFile.Name);
var destFile = fileQuery.FirstOrDefault();
if (destFile != null)
    //...

Бонусный совет: избегайте таких имен, как fiArrNew6; они сбивают с толку. Описательные имена, такие как newFiles их легче читать, и они позволяют изменять код без необходимости переименовывать переменные.

Изменить Select в Where:

FileInfo destFile = fiArrNew6.Where(file => file.Name == origFile.Name).First();

Where вернет IEnumerable<FileInfo>, с помощью First Это обеспечит использование первого такого вхождения (если его нет, оно выдаст исключение).

Другие вопросы по тегам