Tshumore Ответов: 3

LINQ как получить имя файла содержащее конкретное значение


У меня есть программа, которая должна возвращать только одно имя файла, и это зависит от того, содержит ли имя файла определенную строку. Я могу перечислять файлы из каталога, но я получаю
System.Linq.Enumerable+WhereSelectEnumerableIterat
для выбора вместо фактического имени файла. В папке у меня есть файлы с именем :

GL_Export_54_201908220333.xml
GL_Export_55_201907081053.xml
GL_Export_56_201908220337.xml
GL_Export_78_201907081055.xml

Код :
<pre>string period = "55";
 var batchperiod = period.ToString();
 string BatchInPath = @"C:\Users\myuser\source\repos\MySolution\MyProject\BatchIn";
 IEnumerable<string> fileList = Directory.EnumerateFiles( BatchInPath);
  var CurrentBatchName = from file in fileList
                         let fileName = Path.GetFileName(file)
                         where fileName.Contains(batchperiod)
                         select fileName.ToString().First();            
Console.WriteLine(CurrentBatchName)


Так же и с batchperiod как указано выше:

ОЖИДАЕМЫЙ РЕЗУЛЬТАТ

GL_Export_55_201907081053.xml



ФАКТИЧЕСКАЯ ПРОИЗВОДИТЕЛЬНОСТЬ
System.Linq.Enumerable+WhereSelectEnumerableIterat


Что я уже пробовал:

<pre> string period = "55";
 var batchperiod = period.ToString();
 string BatchInPath = @"C:\Users\myuser\source\repos\MySolution\MyProject\BatchIn";
 IEnumerable<string> fileList = Directory.EnumerateFiles( BatchInPath);
  var CurrentBatchName = from file in fileList
                         let fileName = Path.GetFileName(file)
                         where fileName.Contains(batchperiod)
                         select fileName.SingleOrDefault();            
Console.WriteLine(CurrentBatchName)

Maciej Los

Ваше требование не совсем ясно. Пожалуйста, прочтите все ответы, чтобы узнать почему, особенно ответ, предоставленный @phil.o.

3 Ответов

Рейтинг:
8

OriginalGriff

Попробуй:

string batchperiod = "_55_";
string BatchInPath = @"C:\Users\myuser\source\repos\MySolution\MyProject\BatchIn";
IEnumerable<string> fileList = Directory.EnumerateFiles(BatchInPath);
var CurrentBatchName = (from file in fileList
                       let fileName = Path.GetFileName(file)
                       where fileName.Contains(batchperiod)
                       select fileName).FirstOrDefault();
Console.WriteLine(CurrentBatchName);


Maciej Los

Это правильно, в то время как ОП хочет получить только первый "экземпляр" 55 ;)

phil.o

Добавление префикса и суффикса подчеркивания достаточно для различения в этом случае.

Рейтинг:
17

F-ES Sitecore

Просто сделайте что-нибудь простое, например

var CurrentBatchName = fileList.FirstOrDefault(f => f.Contains(batchperiod));


Maciej Los

5!

Рейтинг:
1

phil.o

string period = "55";
var batchperiod = period.ToString();
Зачем ты это делаешь? Зовущий ToString() на переменную, которая уже является string просто не имеет никакого смысла.
Более того, Перечислимый.Метод SingleOrDefault[^] создает исключение, если в последовательности имеется более одного элемента. Что и происходит здесь, так как эти строки:
GL_Export_55_201907081053.xml
GL_Export_78_201907081055.xml
оба содержат в себе 55 последовательность символов.
Может быть, вам нужно регулярное выражение, чтобы отфильтровать результат более точно?


Maciej Los

Хороший улов!

phil.o

Спасибо Мацей :)