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
Это обеспечит использование первого такого вхождения (если его нет, оно выдаст исключение).