如何处理可能的空列表上的排序
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/
如果您担心 productItems
是 null
,只需检查一下:
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
我需要 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/
如果您担心 productItems
是 null
,只需检查一下:
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