我有一些需要List<int?>
,我有List<int>
。如何将int列表转换为可为空的列表<int>?
我可以这样写:
var items = value.Select(num => (int?) num).ToList();
事实果真是最简单的方法是什么?
我有一些需要List<int?>
,我有List<int>
。如何将int列表转换为可为空的列表<int>?
我可以这样写:
var items = value.Select(num => (int?) num).ToList();
事实果真是最简单的方法是什么?
将这项工作?
var items = value.Cast<int?>().ToList();
它像一个魅力。 – scheien
这相当于原始代码,probalby导致相同的IL代码 –
@PanagiotisKanavos:'Select'需要'WhereSelectEnumerableIterator'的另一个实例,而'Cast'只是循环并返回'yield return(TResult)((object)current) ;'。所以'Enumerable.Cast'可能会更有效一些。 –
你也可以使用List.ConvertAll
List<int?> items = value.ConvertAll<int?>(i => i);
它的工作原理,即使在.NET 2.除此之外没有任何优势,所以我会留在LINQ(Enumerable.Cast
由塔米姆塞勒姆的建议),因为它更实用并可读。
但是,如果您需要List<int?>
而不是List<int>
为什么不首先使用它?
你可以使用:
List<int?> newList = oldList.ConvertAll<int?>(i => i);
虽然它可能不近,足以同下面的事情。
试试这个
var result1 = list.ConvertAll<int?>(x => x);
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表达式和投影。
这是如何更简单? 7行而不是1? –
尊敬的先生们,如果您认为简单性是用代码行来衡量的,那么您就是一个白痴。让我用一行代码向你展示一些简单的东西--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);请让我知道如果出现问题,你将如何调试。这是一个简单的例子,在生产代码中想象一下。 –
如果我们跳过列表的初始化(就像上面所做的那样),它仍然可以写成一行 - for(int i = 0; i
避免播和转换
List<int?> nullInts = new List<int?>();
listInts.ForEach(i => nullInts.Add(new int?(i)));
您如何避免在此处投射和转换?转换运算符实际上与您的代码完全相同 - 创建一个包含非空值的新的可为空的实例 –
只需将您的代码和我的代码合并到一起,并查看差异即可。在你的ildasm代码中查找Converter。 – mopicus
如果你发现自己做这么多,你可以实现@ 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();
在您的问题中编写Nullable可能会更好,因为它很混乱。 –
Dirk
似乎很简单,我不会做得更好。 – wondra
我相信是的。这就是我想要做的事情将列表转换为列表> –
Yalda