2012-11-06 106 views
12

我想使用特定順序的對象和對象列表來初始化列表。目前,我做:使用單個對象和另一個對象列表初始化列表

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

我希望能鞏固成一個初始化語句(語法是錯誤的,當然):

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

有沒有辦法簡明做到這一點?

+0

這與LINQ(泛型集合自.NET 2.0以來已經存在)沒有任何關係,所以我將它重新標記爲你。 – Adam

+0

你的第一個代碼片段有什麼問題?它如何不令人滿意或有問題。實際上,其他任何選項都會更復雜,需要更多的代碼,更少的可讀性,而且很可能性能更低。我相信你可以花時間修復你的項目中有更多問題的方面。 – Servy

+0

@Servy我沒有說我的代碼片段有問題。我問是否有一個更簡潔的方式來初始化列表。我不知道所有的選項,因此我問這個問題。我同意大多數其他方式(我知道的幾個方法)更復雜或更不可讀。感謝您的輸入。 –

回答

17

如果元素的順序並不重要,你可以使用:

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

這是通過使用List<T>構造函數接受一個IEnumerable<T>,然後集合初始化器添加其他項目。例如,以下內容:

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

會打印:

3 
4 
5 
2 

注意,爲了比你原來的不同,但是,由於個別項目添加最後

如果順序是重要的,但是,我個人只是建立名單,將在您的第一個對象的初始化,並調用AddRange

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

這使得意圖非常明確,避免施工的臨時物品(這將需要使用LINQ的Concat等)。

+0

我想他希望'object1'在結果列表中排在第一位,所以這不起作用。 – Lee

+1

@Lee Yeah - 這就是爲什麼我在問題中特別標記了這一點。還增加了一個重要的訂單選項。 –

7

我認爲你能做的最好的是:

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

從我+1 - 但意識到這確實會創建一些額外的「垃圾」,因爲你正在做一個數組,只是被扔掉。不是什麼大不了的事情,但似乎有點混亂,以避免方法調用;) –

+0

你認爲這比他開始的代碼片段更具可讀性或者更容易理解嗎?我說這是倒退的一步,不是轉發。 – Servy

+0

@Servy - 這個問題要求更簡潔的方法,這是。 – Lee

相關問題