2014-01-13 153 views
2

我有一些需要List<int?>,我有List<int>如何將int列表轉換爲可爲空的列表<int>?

我可以這樣寫:

var items = value.Select(num => (int?) num).ToList(); 

事實果真是最簡單的方法是什麼?

+3

在您的問題中編寫Nullable 可能會更好,因爲它很混亂。 – Dirk

+0

似乎很簡單,我不會做得更好。 – wondra

+0

我相信是的。這就是我想要做的事情將列表轉換爲列表> – Yalda

回答

12

將這項工作?

var items = value.Cast<int?>().ToList(); 
+0

它像一個魅力。 – scheien

+0

這相當於原始代碼,probalby導致相同的IL代碼 –

+1

@PanagiotisKanavos:'Select'需要'WhereSelectEnumerableIterator'的另一個實例,而'Cast'只是循環並返回'yield return(TResult)((object)current) ;'。所以'Enumerable.Cast'可能會更有效一些。 –

3

你也可以使用List.ConvertAll

List<int?> items = value.ConvertAll<int?>(i => i); 

它的工作原理,即使在.NET 2.除此之外沒有任何優勢,所以我會留在LINQ(Enumerable.Cast由塔米姆塞勒姆的建議),因爲它更實用並可讀。

但是,如果您需要List<int?>而不是List<int>爲什麼不首先使用它?

0

你可以使用:

List<int?> newList = oldList.ConvertAll<int?>(i => i); 

雖然它可能不近,足以同下面的事情。

0

試試這個

var result1 = list.ConvertAll<int?>(x => x); 
0
List<int> a = new List<int>() { 1, 2, 3, 4 }; 
List<Nullable<int>> b = new List<int?>(); 

for (int i = 0; i < a.Count; i++) 
{ 
    b.Add(new Nullable<int>(a[i])); 
} 

如果你想省略lambda表達式和投影。

+2

這是如何更簡單? 7行而不是1? –

+0

尊敬的先生們,如果您認爲簡單性是用代碼行來衡量的,那麼您就是一個白癡。讓我用一行代碼向你展示一些簡單的東西--int count = Enumerable.Range(0,500).AsParallel()。Select(x => new {Id = x})。其中(x => {if(x .Id%2 == 0 || x。Id%5 == 0)return true;返回false; })。Count(x => x.Id <200);請讓我知道如果出現問題,你將如何調試。這是一個簡單的例子,在生產代碼中想象一下。 –

+0

如果我們跳過列表的初始化(就像上面所做的那樣),它仍然可以寫成一行 - for(int i = 0; i (i) )};它更簡單嗎?我想不是。 –

0

避免播和轉換

List<int?> nullInts = new List<int?>(); 
listInts.ForEach(i => nullInts.Add(new int?(i))); 
+0

您如何避免在此處投射和轉換?轉換運算符實際上與您的代碼完全相同 - 創建一個包含非空值的新的可爲空的實例 –

+0

只需將您的代碼和我的代碼合併到一起,並查看差異即可。在你的ildasm代碼中查找Converter。 – mopicus

0

如果你發現自己做這麼多,你可以實現@ TamimSalem在擴展方法解決方案:

public static class EnumerableExt 
{ 
    public static List<T?> ToNullableList<T>(this IEnumerable<T> sequence) where T: struct 
    { 
     return sequence.Cast<T?>().ToList(); 
    } 
} 

然後調用它像這樣:

var items = value.ToNullableList();