2010-06-10 15 views
5

Czy ktoś może mi powiedzieć, co robię źle z następującego kwerendy Linq? Próbuję znaleźć katalog o największej wartości aphanumerycznej.Sprawdź katalogi w języku C# za pomocą Linq

 DirectoryInfo[] diList = currentDirectory.GetDirectories(); 

     var dirs = from eachDir in diList 
        orderby eachDir.FullName descending      
        select eachDir; 
     MessageBox.Show(dirs[0].FullName); 

EDIT:

Powyższy kod nie skompilować, błąd, że kompilator generuje to:

Cannot apply indexing with [] to an expression of type 'System.Linq.IOrderedEnumerable<System.IO.DirectoryInfo> 
+2

Co nie działa? –

+0

Czy błąd kompilatora nie informuje o problemie? –

+0

Tak - przepraszam, zaktualizowałem wpis odpowiednio –

Odpowiedz

10

Próbujesz uzyskać dostęp dirs jakby to była tablicą lub lista. To tylko IEnumerable<T>. Wypróbuj to:

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 

Należy zauważyć, że nie użyłem tutaj wyrażenia zapytania, ponieważ wydaje się ono bezsensowne tylko dla pojedynczej klauzuli. Można umieścić je wszystkie w jednym rachunku, za:

var first = currentDirectory.GetDirectories() 
          .OrderByDescending(eachDir => eachDir.FullName) 
          .FirstOrDefault(); 
1

użycie

DirectoryInfo[] diList = currentDirectory.GetDirectories(); 

    var dir = (from eachDir in diList 
       orderby eachDir.FullName descending      
       select eachDir).FirstOrDefault(); 
    if (dir != null) 
    MessageBox.Show(dir.FullName); 
2

Jest to po prostu przypadek nie czytając komunikat o błędzie.

kod nie kompiluje i tworzy ten komunikat o błędzie:

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

Innymi słowy, [..] część nie działa z przeliczalny, co jest wynikiem korzystania z Zapytanie Linq.

mieć wiele wyborów, ale tutaj są dwa:

  • Konwersja do tablicy, i wybrać pierwszy element
  • Zastosowanie metody rozszerzenie LINQ złapać pierwszy

myślę pierwsza metoda jest złym wyborem, więc oto jak wygląda kod z drugim:

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); 
+0

Więcej o tym, że nie rozumiem komunikatu o błędzie, niż go nie czyta –

3

Jeśli nie użyłeś var, przyczyna błędu byłaby bardziej zrozumiała.

IEnumerable<DirectoryInfo> dirs = from eachDir in diList 
       orderby eachDir.FullName descending      
       select eachDir; 
    MessageBox.Show(dirs[0].FullName); 
+0

Właśnie dlatego nienawidzę podejścia "var", definiując twój typ, jest on o wiele jaśniejszy, słowo kluczowe var wydaje się być ogromnym krokiem wstecz ... – Dal

+0

Zastanawiam się, czy istnieje sposób, aby kompilator ostrzegał podczas używania var, gdy nie są zaangażowane żadne typy anonimowe. –

Powiązane problemy