2008-08-28 31 views
17

Tôi đang sử dụng LINQ để truy vấn từ điển chung và sau đó sử dụng kết quả làm nguồn dữ liệu cho ListView của tôi (WebForms).Làm cách nào tôi có thể chuyển đổi IEnumerable <T> thành Danh sách <T> trong C#?

đang Giản:

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

Tôi nghĩ rằng sẽ làm việc nhưng trên thực tế nó ném một System.InvalidOperationException:

ListView với id 'myListView' phải có một nguồn dữ liệu mà hoặc triển khai ICollection hoặc có thể thực hiện phân trang nguồn dữ liệu nếu AllowPaging là true.

Để làm cho nó làm việc tôi đã phải dùng đến những điều sau:

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(); 

Có một Gotcha nhỏ trong ví dụ đầu tiên để làm cho nó hoạt động?

(Chẳng phải chắc chắn những gì để sử dụng như tiêu đề câu hỏi cho thế này, cảm thấy tự do để chỉnh sửa một cái gì đó thích hợp hơn)

+0

Đây là sự đảo ngược của http://stackoverflow.com/questions/472669/c-freely-convert-between-listt-and-ienumerablet – John

Trả lời

29

Hãy thử điều này:

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

Hãy nhận biết rằng về cơ bản sẽ được tạo danh sách mới từ bộ sưu tập Giá trị ban đầu và do đó mọi thay đổi đối với từ điển của bạn sẽ không tự động được phản ánh trong điều khiển bị ràng buộc của bạn.

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

[@lomaxx] (http://stackoverflow.com/ question/31708/how-can-i-convert-ienumerablet-to-listt-in-C# 31712): Giải pháp đầu tiên của bạn không hoạt động. Tôi dường như không thể truyền kết quả từ mệnh đề where đến một Danh sách . Nó dẫn đến ngoại lệ thời gian chạy sau: * Không thể truyền đối tượng thuộc loại ' d__0'1 [Record]' để nhập 'System.Collections.Generic.List'1 [Record]'. * Giải pháp thứ hai của bạn hoạt động tốt và [Matt Hamiltons] (http://stackoverflow.com/questions/31708/how-can-i-convert-ienumerablet-to-listt-in-c#31710) của. Tôi đã chấp nhận [Matt Hamiltons] (http://stackoverflow.co –

3

Bạn cũng có thể thử:

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

bộ sưu tập cơ bản chung là rất khó khăn để cast trực tiếp, vì vậy bạn thực sự có ít lựa chọn nhưng để tạo ra một đối tượng mới.

9

Tôi có xu hướng thích sử dụng cú pháp LINQ mới:

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

Tại sao cậu lại nhận được một cuốn từ điển khi bạn không sử dụng phím? Bạn đang trả tiền cho chi phí đó.

+0

Upvote cho bạn. – fuzz

+0

[@Keith] (http: // stackoverflow.com/questions/31708/how-can-i-convert-ienumerablet-to-listt-in-C# 32016): Tôi đang sử dụng khóa Guid trong từ điển ở một nơi khác trong mã của mình để tôi có thể lấy một bản ghi id bản ghi. Đồng ý không đồng ý về cú pháp;) –

0

Chỉ cần thêm kiến ​​thức câu tiếp theo sẽ không khôi phục bất kỳ dữ liệu nào từ de db. Chỉ cần tạo truy vấn (cho rằng đó là loại iqueryable). Để khởi chạy truy vấn này, bạn phải thêm .ToList() hoặc .irst() ở cuối.

dict.Values.Where(rec => rec.Name == "foo") 
Các vấn đề liên quan