如何解决 C# 中 linq 的 lambda 表达式中的对象引用错误?

Posted

技术标签:

【中文标题】如何解决 C# 中 linq 的 lambda 表达式中的对象引用错误?【英文标题】:How to resolve object reference error in lambda expression of linq in c#? 【发布时间】:2020-01-14 16:11:28 【问题描述】:

我正在开发 WPF 应用程序。我正在尝试根据所需条件从列表中获取记录。但是当没有找到任何记录时,它会给我找不到对象引用错误。

var recordList = _outputVariables.ToList().Where(X => X.symbolName == _symbolName).ToList();
if (recordList != null)

       //more coding...

如代码中所示,当 _outputVariables 根据 _symbolName 没有任何记录匹配时,它会给出 Object reference not set to an instance of an object.'X was null. 的错误。那么我该如何处理这个问题呢?请帮忙。

【问题讨论】:

.Where(X => X?.symbolName == _symbolName).Where(X => X!= null && X.symbolName == _symbolName) 什么是record1 Where(X => (X.symbolName != null) && (X.symbolName == _symbolName)) 对不起写错了,其实record1是recordList 【参考方案1】:

使用 C#6 中引入的空条件运算符(并且不要多次调用 ToList()):

var recordList = _outputVariables?.Where(X => X?.symbolName == _symbolName).ToList();
if (recordList != null)

    //more coding...

【讨论】:

_outputVariables 正在从其他方法操作,也用于插入和删除操作。因此,如果我没有使用 _outputVariables 提及 ToList,那么它会显示错误,例如 List 已修改。所以我在那里使用 ToList 和 _outputVariables。如果我可以更好地修改它,我想在这里提出建议? @HardikRPatel:如果“其他方法”表示“其他线程”,您应该同步对列表的访问。致电ToList 无济于事。【参考方案2】:

var recordList = _outputVariables.ToList().Where(X => X.symbolName == _symbolName).ToList();

您当前循环通过_outputVariables,但如果是null,则会出现错误,因为null 没有.ToList()。所以你应该在你的_outputVariables之后添加一个?,这样当它为空时它会返回null而不是异常。

X 也是如此。如果Xnull 并且您尝试获取属性symbolName,则会收到错误消息,因为null 没有名为symbolName 的属性。所以你也想在这里添加一个?。所以它会返回null 而不是异常。

留给你:var recordList = _outputVariables?.ToList().Where(X => X?.symbolName == _symbolName).ToList();

【讨论】:

【参考方案3】:

你也可以像下面这样使用

 if (_outputVariables != null && _outputVariables.Count > 0)
            
               var recordList = _outputVariables.Where(X => X != null && !string.IsNullOrEmpty(X.symbolName) && X.symbolName == _symbolName);

            

【讨论】:

如果X 为空,则会抛出此错误。 @Ajax:如果Xnull,它仍然会抛出,而现在你调用ToList() 不止两次而是三次...... @mm8 现在可以了吗?我也测试过它。我只是想用正常的方式来做【参考方案4】:

你可以试试这个

if(_outputVariables!=null)

var recordList = _outputVariables.Where(X => X.symbolName ==_symbolName).ToList();

if (recordList != null)

       //more coding...

【讨论】:

以上是关于如何解决 C# 中 linq 的 lambda 表达式中的对象引用错误?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 LINQ 和 Lambda 表达式 LINQ C# 上正确执行 SQL 查询

如何在 LINQ lambda 中执行多个表之间的联接

在c#中使用lambda或linq查找项目索引[关闭]

C#将字典的LINQ查询重构为单个lambda表达式[关闭]

如何使用lambda表达式和LINQ将数据插入数据库表?

C# linq lambda 分组获取最新的数据