如何处理可能的空列表上的排序

How to handle ordering on possible null list

我需要 return 数据库中的项目,但使用 LINQ 以降序排列。

这是我的代码:

var productItems = dbResult.ProductItems;
resultObj.productItems = productItems.OrderByDescending(x => x.CreatedDate).ToList();

我想知道如果 productItems 为 null,如果我在可能的 null 列表上应用 OrderByDescending,那么代码可能会中断?

那么如何正确处理呢?

如果你的c# 6.0以上,你可以使用'?'检查 null 的运算符 https://csharp.today/c-6-features-null-conditional-and-and-null-coalescing-operators/

如果您担心 productItemsnull,只需检查一下:

var productItems = dbResult.ProductItems;

if (productItems != null)
{
    resultObj.productItems = productItems.OrderByDescending(x => x.CreatedDate).ToList();
}

这取决于您是在谈论列表本身为空还是该列表的某个项目为空。

如果列表为空:

if (productItems != null)
{
    // your LINQ statement
}

对于可能的项目为空:

resultObj.productItems = productItems.Where(item => item != null).OrderByDescending(x => x.CreatedDate).ToList();

但是,此解决方案将忽略列表中的空项,这些项不会出现在 resultObj.productItems

除了之前回答@robbpriestley:

如果您不希望您的 ProductItems 为空,您可以在对列表进行排序之前设置一个空的默认值:

var productItems = dbResult.ProductItems;
if (productItems == null) {
    // Set whatever object it can be, such as
    productItems = new List<object>();
}

resultObj.productItems = productItems.OrderByDescending(x => x.CreatedDate).ToList();

这样,您仍然会得到一个项目列表(或您正在使用的任何实体),但它是空的。

我创建了一个快速应用程序来展示 linq 如何处理 null 项的排序。就像其他一些张贴者所建议的那样,您也应该检查列表是否为空。

class Program
{
    static void Main(string[] args)
    {
        var dbResult = new Product
        {
            ProductItems = new List<ProductItem>
            {
                new ProductItem {CreatedDate = null, ProductName = "SomeProduct"},
                new ProductItem {CreatedDate = DateTime.Now, ProductName = "SomeProduct2"},
                new ProductItem {CreatedDate = DateTime.UtcNow, ProductName = "SomeProduct3"}
            }
        };

        Console.WriteLine("Default Linq Ordering\n");

        var result = dbResult.ProductItems?.OrderByDescending(x => x.CreatedDate).ToList();

        if (result != null)
        {
            foreach (var productItem in result)
            {
                Console.WriteLine("{0} Created Date: {1} \n", productItem.ProductName, productItem.CreatedDate);
            }

            Console.WriteLine("Set null ordering to Datetime.Max\n");
        }

        result = dbResult.ProductItems?.OrderByDescending(x => x.CreatedDate ?? DateTime.MaxValue).ToList();
        if (result != null)
        {
            foreach (var productItem in result)
            {
                Console.WriteLine("{0} Created Date: {1} \n", productItem.ProductName, productItem.CreatedDate);
            }
        }

        Console.ReadLine();
    }
}

public class Product
{
    public List<ProductItem> ProductItems { get; set; }
}
public class ProductItem {
    public DateTime? CreatedDate { get; set; }

    public string ProductName { get; set; }
}

输出结果如下:

Default Linq Ordering

SomeProduct3 Created Date: 12/2/2019 3:32:58 PM

SomeProduct2 Created Date: 12/2/2019 10:32:58 AM

SomeProduct Created Date:

Set null ordering to Datetime.Max

SomeProduct Created Date:

SomeProduct3 Created Date: 12/2/2019 3:32:58 PM

SomeProduct2 Created Date: 12/2/2019 10:32:58 AM