2010-10-26 14 views

Trả lời

16

Không, bạn không thể khởi tạo hàng đợi theo cách đó.

Dù sao, bạn có thể làm một cái gì đó như thế này:

var q = new Queue<string>(new[]{ "A", "B", "C" }); 

và điều này, rõ ràng, có nghĩa là đi qua một mảng.

+0

+1 Có, bạn tạo một mảng trước, nhưng có vẻ đẹp :) – Onkelborg

+0

Được rồi ... đã quá tiện lợi để trở thành sự thật;) Cảm ơn! – xeophin

+0

Phương pháp này có yêu cầu unboxing các chuỗi không? Sẽ 'Danh sách mới {"A", "B", "C"} 'có tốt hơn không? –

3

Như Queue<T> không thực hiện một phương pháp 'Thêm', bạn sẽ cần phải nhanh chóng một IEnumerable<string> mà từ đó nó có thể được khởi tạo:

Queue<string> helperStrings 
    = new Queue<string>(new List<string>() { "right", "left", "up", "down" }); 
12

Có thể làm điều đó trong C#?

Thật không may là không.

Quy tắc cho bộ khởi tạo bộ sưu tập trong C# là đối tượng phải (1) triển khai IEnumerable và (2) có phương thức Thêm. Bộ sưu tập initializer

new C(q) { r, s, t } 

được viết lại như

temp = new C(q); 
temp.Add(r); 
temp.Add(s); 
temp.Add(t); 

và sau đó dẫn đến bất cứ thứ gì trong temp.

Queue<T> triển khai IEnumerable nhưng không có phương thức Thêm; nó có một phương pháp Enqueue.

+0

Cảm ơn lời giải thích đó, điều đó giúp ích rất nhiều trong việc hiểu các cơ chế cơ bản. – xeophin

+0

Vì vậy, bộ lọc intializers về cơ bản là cú pháp đường, phải không? – digEmAll

+2

@digEmAll: đó là chính xác. Vị ngọt của đường ở đây gấp đôi. Đầu tiên, chúng rất nhỏ gọn. Thứ hai, rằng họ biến những gì trước đây có thể là một loạt các phát biểu thành một biểu thức; điều đó có nghĩa là bạn có thể sử dụng chúng trong các bối cảnh mà chỉ một biểu thức là hợp lệ, chẳng hạn như trình khởi tạo trường hoặc truy vấn LINQ. –