2009-10-08 43 views
8

Trong ví dụ dưới đây, làm cách nào tôi có thể dễ dàng chuyển đổi eventScores thành List<int> để tôi có thể sử dụng nó làm thông số cho prettyPrint?Làm thế nào để chuyển đổi System.Linq.Enumerable.WhereListIterator <int> thành Danh sách <int>?

Console.WriteLine("Example of LINQ's Where:"); 
List<int> scores = new List<int> { 1,2,3,4,5,6,7,8 }; 
var evenScores = scores.Where(i => i % 2 == 0); 

Action<List<int>, string> prettyPrint = (list, title) => 
    { 
     Console.WriteLine("*** {0} ***", title); 
     list.ForEach(i => Console.WriteLine(i)); 
    }; 

scores.ForEach(i => Console.WriteLine(i)); 
prettyPrint(scores, "The Scores:"); 
foreach (int score in evenScores) { Console.WriteLine(score); } 

Trả lời

20

Bạn muốn sử dụng phần mở rộng ToList:

var evenScores = scores.Where(i => i % 2 == 0).ToList(); 
+5

pfft , mã chậm! i => (i & 1) == 0 – leppie

+23

Pfft, tối ưu hóa vi mô không được định hướng bằng lược tả. Việc tạo ra trình lặp và bản sao vào danh sách sẽ chậm hơn hàng trăm lần so với bất kỳ khoản tiết kiệm nào được thực hiện bằng cách tối ưu hóa vi toán. * Tối ưu hóa nội dung chậm. * –

9
var evenScores = scores.Where(i => i % 2 == 0).ToList(); 

không hoạt động?

1

Bằng cách này tại sao bạn khai báo prettyprint với loại hình cụ thể như thế cho tham số điểm và vì sử dụng tham số này chỉ như IEnumerable (Tôi giả định này là làm thế nào bạn thực hiện Phương pháp mở rộng ForEach)? Vậy tại sao không thay đổi chữ ký của BeautifulPrint và giữ sự đánh giá lười biếng này? =)

Như thế này:

Action<IEnumerable<int>, string> prettyPrint = (list, title) => 
{ 
    Console.WriteLine("*** {0} ***", title); 
    list.ForEach(i => Console.WriteLine(i)); 
}; 

prettyPrint(scores.Where(i => i % 2 == 0), "Title"); 

Cập nhật:

Hoặc bạn có thể tránh sử dụng List.ForEach như thế này (không đưa vào tài khoản chuỗi nối không hiệu quả):

var text = scores.Where(i => i % 2 == 0).Aggregate("Title", (text, score) => text + Environment.NewLine + score); 
+1

Có thể vì 'ForEach' là một phương thức tích hợp trong lớp' List '. Bạn sẽ phải viết phương thức mở rộng của riêng bạn để sử dụng 'ForEach' với' IEnumerable '. – LukeH

Các vấn đề liên quan