2009-04-17 50 views

Trả lời

21

Giả sử các mặt hàng ghi đè ToString một cách thích hợp:

public void WriteToConsole(IEnumerable items) 
{ 
    foreach (object o in items) 
    { 
     Console.WriteLine(o); 
    } 
} 

(Sẽ có không có lợi thế trong việc sử dụng Generics trong vòng lặp này - chúng tôi muốn kết thúc cuộc gọi Console.WriteLine(object) anyway, do đó nó vẫn sẽ hộp giống như nó trong phần foreach trong trường hợp này.)

EDIT: Câu trả lời bằng cách sử dụng là rất tốt.

Vòng lặp của tôi ở trên linh hoạt hơn trong trường hợp bạn có một chuỗi tùy ý (ví dụ như kết quả của biểu thức LINQ), nhưng nếu bạn chắc chắn có List<T> Tôi muốn nói rằng là một lựa chọn tốt hơn.

Một lợi thế của là nếu bạn có loại danh sách cụ thể, nó sẽ sử dụng quá tải thích hợp nhất. Ví dụ:

List<int> integers = new List<int> { 1, 2, 3 }; 
List<string> strings = new List<string> { "a", "b", "c" }; 

integers.ForEach(Console.WriteLine); 
strings.ForEach(Console.WriteLine); 

Khi viết ra các số nguyên, điều này sẽ sử dụng Console.WriteLine(int), trong khi đó khi viết ra các dây nó sẽ sử dụng Console.WriteLine(string). Nếu không có quá tải cụ thể có sẵn (hoặc nếu bạn chỉ đang sử dụng chung List<T> và trình biên dịch không biết T là gì), nó sẽ sử dụng Console.WriteLine(object).

Lưu ý việc sử dụng Console.WriteLine làm nhóm phương pháp, tiện thể. Điều này ngắn gọn hơn bằng cách sử dụng biểu thức lambda và thực tế là hơi hiệu quả hơn (vì đại biểu sẽ chỉ gọi là gọi tới Console.WriteLine, thay vì gọi đến phương thức mà chỉ cần gọi Console.WriteLine).

+0

Làm thế nào để sử dụng cho các loại đối tượng phức tạp nói Danh sách nơi Người chỉ chứa thuộc tính chuỗi . – Koder101

+0

@ Koder101: Bạn có thể muốn ghi đè 'ToString' trong' Person'. –

14

Bạn cũng có thể sử dụng foreach inbuilt Danh sách, chẳng hạn như:

List<T>.ForEach(item => Console.Write(item)); 

Mã này cũng chạy đáng kể nhanh hơn!

Đoạn mã trên cũng làm cho bạn có thể thao tác Console.WriteLine, chẳng hạn như thực hiện:

List<T>.ForEach(item => Console.Write(item + ",")); //Put a,b etc. 
+0

* Đáng kể * nhanh hơn? Điều đó nghe có vẻ rất khó xảy ra với tôi, vì nút cổ chai sẽ là đầu ra của bàn điều khiển thay vì lặp lại. –

+0

haha ​​Tôi có thể lấy từ đó ra. Đó là chỉ vì Danh sách .ForEach nhanh hơn vì nó chỉ có một cuộc gọi phương thức cho mỗi lần lặp lại so với tiêu chuẩn foreach có 2 cuộc gọi hướng dẫn IL callvirt – CasperT

+0

Có - nó chắc chắn hiệu quả hơn, chỉ không đáng kể. Nó luôn luôn có giá trị trong tâm trí nơi các nút cổ chai thực sự là :) Bạn có thể làm cho phiên bản đầu tiên thậm chí hiệu quả hơn bằng cách sử dụng Console.Write như một nhóm phương pháp, btw ... (Bạn không thể làm điều đó với thứ hai, như bạn đang thực sự thao tác tham số.) –

36

Trên thực tế bạn có thể làm điều đó khá đơn giản, kể từ khi danh sách có một phương pháp ForEach và vì bạn có thể vượt qua trong Console.WriteLine như một nhóm phương pháp. Trình biên dịch sau đó sẽ sử dụng một chuyển đổi ngầm để chuyển đổi các nhóm phương pháp để, trong trường hợp này, một Action<int> và chọn phương pháp cụ thể nhất từ ​​nhóm, trong trường hợp này `Console.WriteLine (int):

var list = new List<int>(Enumerable.Range(0, 50)); 

    list.ForEach(Console.WriteLine); 

trình với chuỗi quá =)

Để hoàn toàn là người theo dõi (và tôi không đề xuất thay đổi câu trả lời của bạn - chỉ cần nhận xét vì lợi ích) "Console.WriteLine" là nhóm phương pháp. Trình biên dịch sau đó sử dụng một chuyển đổi ẩn từ nhóm phương thức thành Hành động, chọn phương thức cụ thể nhất (Console.WriteLine (int) trong trường hợp này).

+2

Để hoàn toàn là người theo dõi (và tôi không đề xuất thay đổi cho câu trả lời của bạn - chỉ cần bình luận vì lợi ích) "Console.WriteLine" là một nhóm phương pháp. Trình biên dịch sau đó sử dụng một chuyển đổi ẩn từ nhóm phương thức thành Hành động , chọn phương thức cụ thể nhất (Console.WriteLine (int) trong trường hợp này). –

+0

Vâng, như tôi đã nói, "nếu tôi nhận được từ ngữ của tôi đúng": p Cập nhật câu trả lời (cho tôi biết nếu tôi nhận lại sai!) – Svish

6
Console.WriteLine(string.Join<TYPE>("\n", someObjectList)); 
+1

Điều này phù hợp nhất với tôi khi tôi có thể chuẩn bị chuỗi của mình trước khi gửi nó đến bảng điều khiển , thay vì gửi một dòng đến bàn điều khiển mỗi lần – Mart10

12

Mặc dù câu trả lời với rất tốt.

Tôi đã tìm thấy phương thức String.Join<T>(string separator, IEnumerable<T> values) hữu ích hơn.

Ví dụ:

List<string> numbersStrLst = new List<string> 
      { "One", "Two", "Three","Four","Five"}; 

Console.WriteLine(String.Join(", ", numbersStrLst));//Output:"One, Two, Three, Four, Five" 

int[] numbersIntAry = new int[] {1, 2, 3, 4, 5}; 
Console.WriteLine(String.Join("; ", numbersIntAry));//Output:"1; 2; 3; 4; 5" 

Ghi chú:

Nếu tách là rỗng, một chuỗi rỗng (String.Empty) được sử dụng để thay thế. Nếu bất kỳ thành viên nào có giá trị là null, một chuỗi trống sẽ được sử dụng thay thế.

Join(String, IEnumerable<String>) là một phương pháp tiện lợi cho phép bạn ghép nối từng phần tử trong bộ sưu tập IEnumerable (Of String) mà không chuyển đổi phần tử thành mảng chuỗi đầu tiên. Nó đặc biệt hữu ích với các biểu thức truy vấn Language-Integrated Query (LINQ).

Điều này sẽ hoạt động tốt cho vấn đề, trong khi đối với những người khác, có giá trị mảng. Sử dụng quá tải khác của phương pháp này tương tự, String.Join Method (String, Object[])

tham khảo: https://msdn.microsoft.com/en-us/library/dd783876(v=vs.110).aspx

1

Tôi thấy điều này dễ hiểu:

List<string> names = new List<string> { "One", "Two", "Three", "Four", "Five" }; 
     for (int i = 0; i < names.Count; i++) 
     { 
      Console.WriteLine(names[i]); 
     } 
Các vấn đề liên quan