从可选列表中删除空后的c#结果类型
本文关键字:结果 类型 删除 列表 | 更新日期: 2023-09-27 18:07:54
假设我有一个c#可选列表(这里称为x
),我通过删除空列表(这里称为y
)创建一个新列表
static void Main()
{
var x = new List<long?> { 7, 8, 9, null, 10, null, 11 };
var y = x.Where(e => e != null);
Console.WriteLine("{0}", y);
}
则推断y
的类型为List<long?>
。获得List<long>
类型的惯用方法是什么?显式展开还是显式强制转换?还是有更干净的方法?
在我正在处理的实际实现中,值作为可选列表进入,我需要将这些列表转换为下游的集合,因此"传递buck"给后续操作不是我想要做的事情(尽管我可以在稍后的代码中进行大量的空检查……呸)。我想要一个长列表变量。如何在c#中最好地考虑和处理这个问题?
只使用x.OfType<long>().ToList()
-这将过滤掉所有的空,结果类型将是List<long>
。
我会检查HasValue
属性并选择Value
你可以试试:
var y = x.Where(e => e.HasValue).Select(e => e.Value);
有或没有.ToList()
我认为最好是创建自己的扩展方法:
public static class Extensions
{
public static IEnumerable<T> RemoveNullsAndConvert<T>(this IEnumerable<T?> source)
where T : struct
{
return from x in source where x != null select x.Value;
}
}
,然后直接使用
var y = x.RemoveNullsAndConvert();
当然,你可以使用更短的方法名,并且实现不一定要使用LINQ -例如,它可以是c#迭代器:
public static class Extensions
{
public static IEnumerable<T> RemoveNullsAndConvert<T>(this IEnumerable<T?> source)
where T : struct
{
foreach (var x in source)
if (x != null) yield return x.Value;
}
}
使用Select进行显式强制转换就可以了:
var x = new List<long?> { 7, 8, 9, null, 10, null, 11 };
var y = x.Where(e => e != null);
Console.WriteLine("{0}", y);
IEnumerable<long> z = x.Where(e => e != null).Select(e => (long)e);
Console.WriteLine("{0}", z);