C# 如果为null,则在linq中将其设置为空字符串lambda表达式

C# 如果为null,则在linq中将其设置为空字符串lambda表达式,c#,linq,generics,lambda,C#,Linq,Generics,Lambda,我有一个foreach循环,看起来像这样: foreach (var item in listOfFieldNames) { list.Where(s => s.GetType().GetProperty(item).GetValue(s, null).ToString().ToLower().Contains(searchString.ToLower())); } 它工作得很好,但只要s是null,我就得到nullreferenceexcep

我有一个foreach循环,看起来像这样:

 foreach (var item in listOfFieldNames)
                {
    list.Where(s =>  s.GetType().GetProperty(item).GetValue(s, null).ToString().ToLower().Contains(searchString.ToLower()));
}
它工作得很好,但只要s是null,我就得到nullreferenceexception

我想把我的s=null改成s=但是我不知道怎么做。 你们能帮帮我吗? 或者,也许有一种方法可以跳过该空记录并继续我的循环,而不会出现异常。这对我也有帮助

花了很长一段时间试图解决这个问题,但在任何地方都找不到答案:/
尝试了一些.DefaultIfEmpty组合,但我不知道该在其中放入什么

如果s有时为空,您可以使用:

list.Where(s => s != null && s.GetType().GetProperty(item).GetValue(s, null).ToString().ToLower().Contains(searchString.ToLower()));
后期编辑

所以问题是GetValue返回null。在这种情况下,可以使用null合并运算符??。我个人会扩展表达式,以便更容易阅读:

list.Where(s => 
{
    var property = s.GetType().GetProperty(item);
    var value = property.GetValue(s, null);
    if (value == null) return false;

    return value.ToString().Contains(searchString, StringComparison.OrdinalIgnoreCase);
});

如果s有时为空,则可以使用:

list.Where(s => s != null && s.GetType().GetProperty(item).GetValue(s, null).ToString().ToLower().Contains(searchString.ToLower()));
后期编辑

所以问题是GetValue返回null。在这种情况下,可以使用null合并运算符??。我个人会扩展表达式,以便更容易阅读:

list.Where(s => 
{
    var property = s.GetType().GetProperty(item);
    var value = property.GetValue(s, null);
    if (value == null) return false;

    return value.ToString().Contains(searchString, StringComparison.OrdinalIgnoreCase);
});
要在循环之前从列表中删除空引用,请执行以下操作:

list.RemoveAll(s => s == null);
要在循环之前从列表中删除空引用,请执行以下操作:

list.RemoveAll(s => s == null);

您使用的是什么版本的VS/C?VS2013所以它是C 5我猜您使用的是什么版本的VS/C?VS2013所以它是C 5我猜列表。其中=>s.GetType.GetPropertyitem.GetValues,null!=null&&s.GetType.GetPropertyitem.GetValues,null.ToString.ToLower.ContainessSearchString.ToLower;工作:D超级丑陋,但工作:Dlist.Wheres=>s.GetType.GetPropertyitem.GetValues,null!=null&&s.GetType.GetPropertyitem.GetValues,null.ToString.ToLower.ContainessSearchString.ToLower;工作:D超级丑陋,但工作:DLooks非常清晰。谢谢我明天试试。顺便说一句,不声明这么多变量不是更好吗?我是一名初级开发人员,但希望从一开始就获得最佳实践。这就是我问的原因。看起来很清楚。谢谢我明天试试。顺便说一句,不声明这么多变量不是更好吗?我是一名初级开发人员,但希望从一开始就获得最佳实践。这就是我问的原因。