Кто-то может сказать мне, что я делаю неправильно со следующим запросом Linq? Я пытаюсь найти каталог с самым высоким значением aphanumerical.
DirectoryInfo[] diList = currentDirectory.GetDirectories();
var dirs = from eachDir in diList
orderby eachDir.FullName descending
select eachDir;
MessageBox.Show(dirs[0].FullName);
Править:
Вышеупомянутый код не компилирует, ошибка, которую генерирует компилятор:
Cannot apply indexing with [] to an expression of type 'System.Linq.IOrderedEnumerable<System.IO.DirectoryInfo>
Вы пытаетесь получить доступ к dirs
, как если бы это был массив или список. Это просто IEnumerable
. Попробуйте так:
var dirs = diList.OrderByDescending(eachDir => eachDir.FullName);
var first = dirs.FirstOrDefault();
// Now first will be null if there are no directories, or the first one otherwise
Обратите внимание, что я не использовал здесь выражение запроса, потому что это кажется довольно бессмысленным для одного предложения. Вы могли бы поместить все это и в один оператор:
var first = currentDirectory.GetDirectories()
.OrderByDescending(eachDir => eachDir.FullName)
.FirstOrDefault();
Это просто случай нечтения сообщения об ошибке.
Код не компилируется и выдает сообщение об ошибке:
Cannot apply indexing with [] to an expression of type 'System.Linq.IOrderedEnumerable
'
Другими словами, часть [...]
не работает с enumerable, который является результатом использования запроса Linq.
У вас есть несколько вариантов, но вот два:
Я думаю, что первый метод - плохой выбор, поэтому вот как выглядит код со вторым:
DirectoryInfo[] diList = currentDirectory.GetDirectories();
var dirs = from eachDir in diList
orderby eachDir.FullName descending
select eachDir;
var dir = dirs.FirstOrDefault();
if (dir != null)
MessageBox.Show(dir.FullName);
Если бы вы не использовали var
, причина ошибки была бы более ясной.
IEnumerable<DirectoryInfo> dirs = from eachDir in diList
orderby eachDir.FullName descending
select eachDir;
MessageBox.Show(dirs[0].FullName);
use
DirectoryInfo[] diList = currentDirectory.GetDirectories();
var dir = (from eachDir in diList
orderby eachDir.FullName descending
select eachDir).FirstOrDefault();
if (dir != null)
MessageBox.Show(dir.FullName);