Linq Lambda表达式用于检查null或空值

3

我很新手使用Linq和Lambda表达式,我想修改这段代码:

    if (string.IsNullOrEmpty(model.PictureUrl1) && string.IsNullOrEmpty(model.Picture2Url) &&
        string.IsNullOrEmpty(model.Picture3Url) && string.IsNullOrEmpty(model.Picture4Url) &&
        string.IsNullOrEmpty(model.Picture5Url) && string.IsNullOrEmpty(model.Picture6Url))
        return Content("");

现在,我对该模型进行了重构,使其具有这些属性和一个包含这些对象的列表。
public class PublicInfoModelItem 
{
    public string PictureUrl { get; set; }
    public string Text { get; set; }
    public string Link { get; set; }
}

并且列表如下:

public List<PublicInfoModelItem> ListOfImages = new List<PublicInfoModelItem>();

模型:

public class PublicInfoModel 
{
    public List<PublicInfoModelItem> ListOfImages = new List<PublicInfoModelItem>();

    public string Container { get; set; }

    public int TemplateId { get; set; }

    public PublicInfoModelItem InfoModelItem { get; set; }

}

我认为可以采用Lambda表达式,类似于:

    var result = model.ListOfImages.Where(x => string.IsNullOrEmpty(x.PictureUrl)).ToList();
    if (result == null)
    {
        return Content("");
    }

我不知道上述表达是否正确或者是否可以改进。

1
你发布的表达式没有问题,除了如果没有找到ListOfImagesToList()会返回一个空列表而不是null。 - nbokmans
1
返回翻译后的文本:结果永远不会是“null”。它的“count”可能为0。如果我正确理解你的目标,你可以使用“if(model.ListOfImages.All(x => string.IsNullOrEmpty(x.PictureUrl)))”。 - Me.Name
5个回答

5
我认为你想使用 Any:
if (!model.ListOfImages.Any(x => string.IsNullOrEmpty(x.PictureUrl)))
{
    return Content("");
}

2

补充Brett的解决方案:

if (!model.ListOfImages.Any(x => string.IsNullOrEmpty(x.PictureUrl)))
{
    return Content("");
}

也许这正是你在寻找的内容。但它几乎与以下内容相同:
if(model.ListOfImages.All(x=> !string.IsNullOrEmpty(x.PictureUrl)))
{
return Content("");
}

这里唯一的区别是:Any将返回第一个被评估为true的项目,而All将返回第一个被评估为false的项目。但由于All的谓词被否定,它会出现在列表中的同一元素,并具有相同的结果。
但是当您需要进行更多检查时,All非常方便,例如:
if(model.ListOfImages.All(x=> !string.IsNullOrEmpty(x.PictureUrl) && x.PictureUrl.EndsWith(".jpg")))
{
return Content("");
}

1
这个QA是我们经常忽略小细节的又一个例子。我和Brett都把答案搞反了!包括点赞,总共有5个人忽略了这个错误! - galdin
我们也在孤立地看待这个问题,而不考虑其他的代码。使用 "if any(isnullorempty()) do the other thing" 可能更高效。然而,在我的回答中,确实应该使用 "All" 而不是 "!Any",因为意图更清晰。我匆忙添加了否定语气,使其与原始问题相符。有罪。 - Brett
@Brett 不过,使用否定很容易犯错。 OP 代码的等效构造是 All(IsNullOrEmpty)。如果要使用Any,则必须否定方法和谓词,即!Any(!IsNullOrEmpty),在这种情况下更难阅读。 - Ivan Stoev

1
你想要查找是否存在空值。因此,另一个选项是使用Exists()函数:
if(model.ListOfImages.Exists(image => string.IsNullOrEmpty(x.PictureUrl)))
{
    return Content("");
}

我认为你漏掉了 !。如果没有任何一个值为空,返回必须是。 - Sach
@Sach 不,返回值必须是如果所有的值都是 null/empty。所以我的答案是错误的,因为它会在其中一个值为 null/empty 时返回。 - galdin

0

是的,你可以这样做。我按照以下方式申请:

var accionistas = repositorio.FindEntitySet<TBL_Accionista>(p => p.Estatus.Equals(1)).Select(a => new { a.Id_Accionista, Nombre = a.Apellido_Paterno + " " + a.Apellido_Materno + " " + a.Primer_Nombre, RazonSocial = String.IsNullOrEmpty(a.Razon_Social)?string.Empty:a.Razon_Social, a.RFC });

0
您可以尝试类似以下的代码来过滤一些值:
var result = ListOfImages.Any(x => (!string.IsNullOrEmpty(x.PictureUrl)) && (x.PictureUrl.Contains("text-to-filter")));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接