2012-11-06 15 views
12

Chcę zainicjować listę z obiektem i listą obiektów w tej określonej kolejności. Obecnie robię:Inicjalizuj listę z jednym obiektem i inną listą obiektów.

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

miałem nadzieję, że konsolidacja w instrukcji inicjalizacji (składnia jest źle oczywiście):

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

Czy istnieje sposób, aby to zrobić zwięźle?

+0

to nie ma nic wspólnego z LINQ (ogólne kolekcje istnieją od .NET 2.0), więc ponownie je otagowałem. – Adam

+0

Jaki masz problem z pierwszym fragmentem kodu? Jak to jest w jakikolwiek sposób niezadowalające lub problematyczne? Praktycznie każda inna opcja będzie bardziej złożona, pobierze więcej kodu, będzie mniej czytelna i najprawdopodobniej będzie mniej wydajna. Jestem pewien, że masz więcej problematycznych aspektów swojego projektu, które możesz poświęcić na naprawę. – Servy

+0

@Servy Nie stwierdziłem, że mój fragment kodu był problematyczny. Zapytałem, czy istnieje bardziej zwięzły sposób inicjowania listy. Nie znam wszystkich dostępnych opcji, dlatego zadałem to pytanie. Zgadzam się, że większość innych sposobów (tych, które znam) jest bardziej złożonych lub mniej czytelnych. Dzięki za wkład. –

Odpowiedz

17

Jeśli kolejność elementów nie jest ważne, można użyć:

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

Działa to za pomocą konstruktora List<T> który akceptuje IEnumerable<T>, a następnie inicjator kolekcji, aby dodać inne elementy. Na przykład, następujący:

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(); 
} 

wypisze:

3 
4 
5 
2 

Zauważ, że kolejność jest inna niż oryginału, jednak, jak indywidualna pozycja dodaje ostatni.

Jeśli kolejność jest ważna, jednak ja osobiście po prostu zbudować listę, umieszczając w swoim pierwszym obiektem w inicjatora i nazywając AddRange:

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

To sprawia, że ​​intencją bardzo jasne, a unika się budowy przedmiotów tymczasowych (które byłyby wymagane przy użyciu konkluzji LINQ itp.).

+0

Myślę, że chce, aby 'object1' był na pierwszym miejscu na liście wynikowej, więc to nie zadziała. – Lee

+1

@ Lee Yeah - właśnie dlatego oznaczyłem to konkretnie w pytaniu. Dodano także opcję, w której ważna jest kolejność. –

7

myślę, że najlepiej można zrobić, to:

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

+1 ode mnie - ale zdajesz sobie sprawę, że to tworzy dodatkowe "śmieci", ponieważ tworzysz tablicę, która zostaje wyrzucona. Nic wielkiego, ale wydaje się trochę bałaganu, aby uniknąć wywołania metody;) –

+0

Czy uważasz, że jest to bardziej czytelne lub w jakikolwiek sposób łatwiejsze do zrozumienia niż fragment kodu, z którego zaczął? Mówię, że jest to krok wstecz, a nie naprzód. – Servy

+0

@Servy - Pytanie wymagało bardziej zwięzłej metody, a to właśnie jest. – Lee