Проверьте Каталоги в использование C# Linq

Кто-то может сказать мне, что я делаю неправильно со следующим запросом 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>
5
задан Paul Michaels 10 June 2010 в 13:33
поделиться

4 ответа

Вы пытаетесь получить доступ к 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();
10
ответ дан 18 December 2019 в 10:42
поделиться

Это просто случай нечтения сообщения об ошибке.

Код не компилируется и выдает сообщение об ошибке:

Cannot apply indexing with [] to an expression of type 'System.Linq.IOrderedEnumerable'

Другими словами, часть [...] не работает с enumerable, который является результатом использования запроса Linq.

У вас есть несколько вариантов, но вот два:

  • Преобразовать в массив и выбрать первый элемент
  • Использовать метод расширения 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);
2
ответ дан 18 December 2019 в 10:42
поделиться

Если бы вы не использовали var , причина ошибки была бы более ясной.

    IEnumerable<DirectoryInfo> dirs = from eachDir in diList 
               orderby eachDir.FullName descending                     
               select eachDir; 
    MessageBox.Show(dirs[0].FullName);
3
ответ дан 18 December 2019 в 10:42
поделиться

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);
1
ответ дан 18 December 2019 в 10:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: