2009-09-04 18 views
14

Jaki jest najbardziej efektywny sposób konwersji zapytania pojedynczej kolumny linq do tablicy łańcuchów?Konwertuj zapytanie linq do tablicy ciągów - C#

private string[] WordList() 
    { 
     DataContext db = new DataContext(); 

     var list = from x in db.Words 
        orderby x.Word ascending 
        select new { x.Word }; 

     // return string array here 
    } 

Uwaga - x.Word jest ciągiem

Odpowiedz

30

Wolę styl lambda, i naprawdę powinny być utylizacji swój kontekst danych.

private string[] WordList() 
{ 
    using (DataContext db = new DataContext()) 
    { 
     return db.Words.Select(x => x.Word).OrderBy(x => x).ToArray(); 
    } 
} 
+2

Lubię dawać gc trening! - tylko żartuję - to bardzo dobry punkt. Dzięki. –

+0

Niesamowite rozwiązanie! –

4

po wpisaniu go w składni lambda zamiast tego można zrobić to nieco łatwiej metodą ToArray:

string[] list = db.Words.OrderBy(w=> w.Word).Select(w => w.Word).ToArray(); 

lub nawet krócej:

return db.Words.OrderBy(w => w.Word).Select(w => w.Word).ToArray(); 
+0

zarówno dać błąd - nie można niejawnie przekonwertować typu „Słowo []” do „string []” –

+0

Poprawione go brakowało .word bit – Robban

7

Jak o:

return list.ToArray(); 

Zakłada się, że x.Word jest w rzeczywistości ciągiem.

przeciwnym razie można spróbować:

return list.Select(x => x.ToString()).ToArray(); 
+0

Pierwszy sposób daje ten błąd - nie można niejawnie przekonwertować typu „AnonymousType nr 1 [] "do" napis [] ". Druga metoda działa! Dzięki! –

+0

Pomiń nowy {} w swoim wyborze i nie będziesz musiał rozpakowywać anonimowego typu, będziesz miał tylko ciąg (zakładając, że Word jest kolumną znaków). – tvanfosson

+0

@tvanfosson, co to znaczy "* rozpakować anonimowy typ *"? (Zakładam, że dokonano edycji tej odpowiedzi, ponieważ nie widzę już żadnego 'nowego {}'.) – kdbanman