2010-11-06 36 views
13

Tôi muốn tạo một số nguyên C# List, từ 1930 đến 2010. Tắt đầu của tôi, cách duy nhất tôi có thể nghĩ là làm điều này for hoặc while vòng lặp để lặp qua từng số nguyên giữa các số và thêm chúng vào số List riêng lẻ.C#: Xây dựng Danh sách các năm là số nguyên

Tôi biết danh sách C# có rất nhiều phương pháp thú vị, đặc biệt khi bạn đang sử dụng LINQ. Bất cứ ai có thể nghĩ ra một cách hiệu quả hơn để làm điều này?

+0

Bạn có thể giải thích thêm một chút không, tại sao bạn tạo ra những năm này? để chúng tôi có thể đưa ra đề xuất tốt hơn. –

+0

Sử dụng vòng lặp while for for sẽ hiệu quả. Việc tái sử dụng kết quả có thể quan trọng hơn từ một quan điểm hiệu quả, hơn là cách nó được tạo ra. –

+0

@chibacity, tôi đang xây dựng các giá trị để sử dụng trong danh sách chọn thả xuống trong HTML, vì vậy có thể không cần phải lo lắng về cách Danh sách sẽ được sử dụng. –

Trả lời

33

Enumerable.Range(1930, 81) (MSDN docs) sẽ cho bạn một số đếm chứa những gì bạn muốn. Tham số đầu tiên là giá trị bắt đầu và giá trị thứ hai là số mục. Bạn cần 81 thay vì 80 vì bạn muốn từ 1930 đến 2010.

Nếu bạn rõ ràng muốn nó là List, hãy sử dụng Enumerable.Range(1930, 81).ToList().

Phương pháp này có thể không khác về mặt hiệu quả, nhưng là mã ngắn gọn hơn.

+1

+1. Tài liệu này có ý định tốt hơn, có tính khai báo nhiều hơn mệnh lệnh, và ít dễ bị trục trặc hơn, giống như các biến vòng lặp vô tình thay đổi. Một sang một bên: Tôi muốn có một chức năng giống như Phạm vi lấy giới hạn dưới và trên, chứ không phải là giới hạn dưới và đếm. Bạn không chắc chắn những gì bạn muốn gọi nó, hoặc làm thế nào để đối phó với các vấn đề đặt tên/sử dụng bao gồm/độc quyền, tho :) –

+0

@Merlyn: vâng, tôi đồng ý. Một cái gì đó giống như cú pháp của [# 1930..2010] của F # sẽ tốt đẹp. – adrianbanks

7

Sử dụng Enumerable.Range()

var MyList = Enumerable.Range(1930, 2010-1930+1).ToList(); 
+1

Tôi không thể làm 'Danh sách mới (Enumerable.Range (1930, 2010-1930 + 1)) 'và tránh vòng lặp? –

+0

@Mega Matt: vâng. Tôi chỉ nhận ra rằng bộ não của tôi đã tan vỡ. –

+0

@ Mega: Vòng lặp nào? Bất kỳ vòng lặp nào trong mã của anh ta cũng sẽ tồn tại trong mã của bạn (sao chép số đếm vào danh sách). –

3

Hai câu trả lời khác là chính xác, sử dụng Enumberable.Range() là/cách nhanh chóng dễ dàng để làm điều này, nhưng tôi sẽ thêm vào mảnh. Sử dụng DateTime.Now.Year để bạn không phải sửa mã mỗi năm. Trong hai tháng, việc sử dụng giá trị mã hóa cứng cho tham số thứ hai sẽ làm cho lỗi này bị lỗi thời.

List<int> listYears = Enumerable.Range(1930, DateTime.Now.Year - 1930 + 1).ToList(); 
1

Vì vậy, trong khi điều này đã được trả lời (với câu trả lời tốt), tại sao không tạo một phương pháp mà 'lãi suất' (a generator method)-Enumerable.Range chỉ là như vậy một phương pháp đó là tiêu chuẩn:

IEnumerable<int> InclusiveRange(int s, int e) { 
    for (int i = s; i <= e; i++) { 
    yield return i; 
    } 
} 

var r = InclusiveRange(1930, 2010).ToList(); 

Chúc mừng mã hóa.

+0

Tôi đã kết hợp nó với ** jb. ** trả lời: 'var r = InclusiveRange (1930, DateTime.Now.Year - 1930 + 1) .ToList();' :) – Noctis

+0

@Noctis Không cần phải trừ đầu năm; chỉ 'var r = InclusiveRange (1930, DateTime.Now.Year) .ToList();' – Stajs

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