2012-11-06 51 views
12

Tôi muốn khởi tạo một danh sách với một đối tượng và một danh sách các đối tượng theo thứ tự cụ thể đó. Hiện nay, tôi đang làm:Khởi tạo danh sách với cả một đối tượng đơn và một danh sách đối tượng khác

List<MyObject> list = new List<MyObject>(); 
list.Add(object1); // object1 is type MyObject 
list.AddRange(listOfObjects); // listOfObjects is type List<MyObject> 

Tôi đã hy vọng để củng cố đó vào một tuyên bố khởi (cú pháp là sai tất nhiên):

List<MyObject> newList = new List<MyObject>() { object1, listOfObjects }; 

Có cách nào để làm điều này chính xác?

+0

điều này không liên quan gì đến LINQ (các bộ sưu tập chung đã tồn tại từ .NET 2.0), vì vậy tôi đã gắn thẻ lại cho bạn. – Adam

+0

Bạn gặp vấn đề gì với đoạn mã đầu tiên của mình? Làm thế nào là nó trong bất kỳ cách nào không đạt yêu cầu hoặc có vấn đề. Hầu như bất kỳ tùy chọn nào khác sẽ phức tạp hơn, lấy nhiều mã hơn, ít có thể đọc được hơn và rất ít có khả năng hoạt động tốt hơn. Tôi chắc chắn có nhiều khía cạnh có vấn đề hơn trong dự án của bạn mà bạn có thể dành thời gian sửa chữa. – Servy

+0

@Servy Tôi đã không nói rằng đoạn mã của tôi là vấn đề. Tôi hỏi nếu có một cách ngắn gọn hơn để khởi tạo danh sách. Tôi không biết tất cả các tùy chọn trên mạng, do đó tôi hỏi câu hỏi. Tôi đồng ý rằng hầu hết các cách khác (số ít tôi biết) phức tạp hơn hoặc ít có thể đọc được. Cảm ơn vì đầu vào của bạn. –

Trả lời

17

Nếu thứ tự của các yếu tố không quan trọng, bạn có thể sử dụng:

List<MyObject> newList = new List<MyObject>(listOfObjects) { object1 }; 

này hoạt động bằng cách sử dụng các nhà xây dựng List<T> mà chấp nhận an IEnumerable<T>, sau đó bộ khởi tạo bộ sưu tập để thêm các mục khác. Ví dụ, sau đây:

static void Main() 
{ 
    int test = 2; 
    List<int> test2 = new List<int>() { 3, 4, 5 }; 
    List<int> test3 = new List<int>(test2) { test }; 

    foreach (var t in test3) Console.WriteLine(t); 

    Console.ReadKey(); 
} 

Sẽ in:

3 
4 
5 
2 

Lưu ý rằng thứ tự khác với ban đầu của bạn, tuy nhiên, như mục riêng lẻ được thêm cuối cùng.

Nếu trật tự là rất quan trọng, tuy nhiên, cá nhân tôi sẽ chỉ cần xây dựng danh sách, đặt trong đối tượng đầu tiên của bạn trong initializer, và kêu gọi AddRange:

List<MyObject> newList = new List<MyObject> { object1 }; 
newList.AddRange(listOfObjects); 

Điều này làm cho mục đích rất rõ ràng, và tránh xây dựng các mục tạm thời (cần được sử dụng bằng cách sử dụng Concat của LINQ, v.v.).

+0

Tôi nghĩ rằng anh ta muốn 'object1' đến đầu tiên trong danh sách kết quả, do đó, điều này sẽ không hoạt động. – Lee

+1

@Lee Yeah - đó là lý do tại sao tôi gắn thẻ cụ thể trong câu hỏi. Cũng thêm một tùy chọn với thứ tự quan trọng. –

7

Tôi nghĩ rằng tốt nhất bạn có thể làm là:

List<MyObject> newList = new[] { object1 }.Concat(listOfObjects).ToList(); 
+1

+1 từ tôi - nhưng nhận ra điều này không tạo thêm một số "rác" vì bạn đang tạo một mảng chỉ bị vứt bỏ. Không phải là một vấn đề lớn, nhưng có vẻ như một chút lộn xộn để tránh một cuộc gọi phương thức;) –

+0

Bạn có nghĩ rằng điều này dễ đọc hơn hoặc dễ hiểu hơn đoạn mã mà anh ta bắt đầu không? Tôi nói rằng đây là một bước lùi, không chuyển tiếp. – Servy

+0

@Servy - Câu hỏi được yêu cầu cho một phương pháp ngắn gọn hơn, và đây là. – Lee

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