2008-08-28 29 views
17

Używam LINQ do wysyłania zapytań do ogólnego słownika, a następnie używam wyniku jako źródła danych dla mojego ListView (WebForms).Jak przekonwertować IEnumerable <T> na listę <T> w języku C#?

kod uproszczony:

Dictionary<Guid, Record> dict = GetAllRecords(); 
myListView.DataSource = dict.Values.Where(rec => rec.Name == "foo"); 
myListView.DataBind(); 

Myślałem, że będzie działać, ale w rzeczywistości to rzuca System.InvalidOperationException:

ListView z 'id' myListView musi mieć źródło danych, które albo implementuje ICollection lub może wykonać stronicowanie źródła danych , jeśli AllowPaging ma wartość true.

Aby dostać pracy musiałem uciekać się do następujących:

Dictionary<Guid, Record> dict = GetAllRecords(); 
List<Record> searchResults = new List<Record>(); 

var matches = dict.Values.Where(rec => rec.Name == "foo"); 
foreach (Record rec in matches) 
    searchResults.Add(rec); 

myListView.DataSource = searchResults; 
myListView.DataBind(); 

Czy istnieje małe haczyka w pierwszym przykładzie, aby to działało?

(nie byłem pewien, co do wykorzystania jako tytuł zapytania dla tego jednego, nie krępuj się zmieniać na coś bardziej odpowiedniego)

+0

Jest to odwrotność http://stackoverflow.com/questions/472669/c-freely-convert-between-listt-and-ienumerablet – John

Odpowiedz

29

Spróbuj tego:

var matches = dict.Values.Where(rec => rec.Name == "foo").ToList(); 

Należy pamiętać, że będzie zasadniczo tworzenie nowej listy z oryginalnej kolekcji Values, więc wszelkie zmiany w słowniku nie będą automatycznie odzwierciedlane w kontrolce.

1
myListView.DataSource = (List<Record>) dict.Values.Where(rec => rec.Name == "foo"); 
+0

[@lomaxx] (http://stackoverflow.com/ pytania/31708/how-can-i-convert-ienumerablet-to-list-in-C# 31712): Twoje pierwsze rozwiązanie nie działa. Nie mogę wydawać się być w stanie rzucić wynik z klauzuli where do listy . Powoduje to następujący wyjątek środowiska wykonawczego: * Nie można rzutować obiektu typu " d__0'1 [Record]", aby wpisać "System.Collections.Generic.List'1 [Record]". * Twoje drugie rozwiązanie działa świetnie i tak samo [Matt Hamiltons] (http://stackoverflow.com/questions/31708/how-can-i-convert-ienumerablet-to-listt-in-c#31710). Zaakceptowałem [Matt Hamiltons] (http://stackoverflow.co –

3

Możecie też spróbować:

var matches = new List<Record>(dict.Values.Where(rec => rec.Name == "foo")); 

zbiory Zasadniczo generyczne są bardzo trudne do oddania bezpośrednio, tak naprawdę mają niewielki wybór, ale aby utworzyć nowy obiekt.

9

I zazwyczaj wolą używać nowej składni Linq:

myListView.DataSource = (
    from rec in GetAllRecords().Values 
    where rec.Name == "foo" 
    select rec).ToList(); 
myListView.DataBind(); 

Czemu coraz słownika, gdy nie jest używany klucz? Płacisz za to obciążenie.

+0

Awans dla ciebie: – fuzz

+0

[@Keith] (http: // stackoverflow.com/questions/31708/how-can-i-convert-ienumerablet-to-list-in-C# 32016): Używam klucza Guid w słowniku gdzieś indziej w moim kodzie, dzięki czemu mogę uzyskać rekord przez id rekordu. Zgadzam się nie zgadzać co do składni;) –

0

Po prostu dodając wiedzę następne zdanie nie odzyskuje żadnych danych z bazy danych. Po prostu utwórz zapytanie (ponieważ jest to typ zapytania). Aby uruchomić to zapytanie, musisz dodać końcówkę .ToList() lub .First() na końcu.

dict.Values.Where(rec => rec.Name == "foo") 
Powiązane problemy