所以我處于一個棘手的情況,我有一個特定模型的專案集合。為簡單起見,我制作了一個名為CarModel. 在集合中,它將具有 x 數量,CarModel其中某些物件具有值為 null 的屬性。
至于現在,它將where在前 3 個專案上運行 LINQ 陳述句就好了,因為它們為空,因為它可以檢查是否null == null.. 但是,它無法檢查是否"Test" == null,因此我目前遇到例外
System.ArgumentNullException: '值不能為空。引數名稱:值'
在這條線上cars.Where(x => x.Name?.ToLower().Contains(car.Name?.ToLower()) == true).ToList();
我正在考慮使Name屬性可以為空以測驗它是否可以作業,但我被系結.NET Framework 4.0并且我不允許更改它,所以我不能使用可以為空的屬性,因為這需要 C# 8.0 并且語言版本與框架,所以我在 C# 7.3
using System.Collections.Generic;
using System.Linq;
using System;
class Program
{
static void Main(string[] args)
{
var car = new CarModel();
car.Name = null;
var cars = new List<CarModel>();
for (int i = 0; i < 3; i )
{
cars.Add(new CarModel { Name = null });
}
for (int i = 0; i < 3; i )
{
cars.Add(new CarModel { Name = "Test" });
}
var t = cars.Where(x => x.Name?.ToLower().Contains(car.Name?.ToLower()) == true).ToList();
}
}
internal class CarModel
{
public string Name { get; set; }
public int Year { get; set; }
}
如果某些屬性有時可能為空,我該如何正確過濾。正確的目標是回傳它找到的 3 個專案的集合,因為它與 WHERE 陳述句中的條件匹配。
uj5u.com熱心網友回復:
在提供的示例car.Name中是 always null,但我假設您有一個實際用例,但并非總是如此。
您得到的例外來自Contains無法處理null引數的方法。您需要為此添加一個檢查,或者跳過處理匹配串列的整個部分(未顯示),或者在為空時初始化一個空串列car.Name。就像是:
var t = car.Name is null ? new List<CarModel>() :
cars.Where
(
x => x.Name?.Contains(car.Name, StringComparison.InvariantCultureIgnoreCase) == true
).ToList();
那是假設您不想匹配null(null正如永順的回答那樣)。
不過老實說,確保您的CarModel物件不接受null名稱值可能更有意義。在建構式中需要一個名稱,使用拋出的屬性設定器null等等。當然,取決于用例。
uj5u.com熱心網友回復:
只需在使用包含之前過濾掉空值,您不能對空值執行包含。
var t = cars.Where(x => x.Name != null && x.Name.ToLower().Contains(car.Name)).ToList();
uj5u.com熱心網友回復:
也許您可以撰寫處理 2 個條件的查詢:
- 當輸入值為 時,用
null查詢。Namenull - 當輸入值為 not時,使用 not進行
null查詢并執行不區分大小寫的搜索。Namenull - 條件 1 和 2
or(滿足任一條件)。
var t = cars.Where(x => (car.Name == null && x.Name == null)
|| (car.Name != null && x.Name != null && x.Name.ToLower().Contains(car.Name.ToLower()) == true))
.ToList();
示例程式
uj5u.com熱心網友回復:
您收到例外錯誤的原因是因為 Contains 方法需要非空引數。
所以你應該修改你的代碼,如下所示,
var t = cars.Where(x => x.Name?.ToLower().Contains(car.Name?.ToLower() ?? string.Empty) == true).ToList();
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/437615.html
