2014-01-13 106 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();