从可选列表中删除空后的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#中最好地考虑和处理这个问题?

从可选列表中删除空后的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);