You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用C# LINQ实现按字符串数组模糊过滤License对象数组?

问题:LINQ实现多字符串部分匹配过滤License对象

现有代码与定义

获取License数组的代码:

var licenses = await _licenseRepository.SearchAsync(ct); // CT = CancellationToken

过滤用的记录类:

public sealed record Filter(LicenseTypeValues[] Id, string[] Name);

需求说明

传入Filter.Name字符串数组,返回所有名称**包含数组中任一字符串(部分匹配)**的License对象。例如:无过滤时返回5条数据,传入["Windows 201", "Ubuntu 23"]应返回3条匹配数据。

当前尝试的问题

以下LINQ代码仅支持精确匹配,无法满足部分匹配需求:

var licenses = await _repository.FindAll().Where(x => filter.Name.Contains(x.Name)).ToArrayAsync();

优雅LINQ解决方案

使用Any()方法遍历过滤数组,检查当前License名称是否包含任一过滤字符串,无需foreach循环:

基础实现

var licenses = await _repository.FindAll()
    .Where(x => filter.Name.Any(filterName => x.Name.Contains(filterName)))
    .ToArrayAsync(ct);

带忽略大小写的实现(推荐)

如果需要不区分大小写的匹配,添加StringComparison参数:

var licenses = await _repository.FindAll()
    .Where(x => filter.Name.Any(filterName => x.Name.Contains(filterName, StringComparison.OrdinalIgnoreCase)))
    .ToArrayAsync(ct);

处理空过滤条件

如果filter.Name为空或null时需返回全部数据,可添加边界判断:

var query = _repository.FindAll();

if (filter?.Name != null && filter.Name.Length > 0)
{
    query = query.Where(x => filter.Name.Any(filterName => x.Name.Contains(filterName, StringComparison.OrdinalIgnoreCase)));
}

var licenses = await query.ToArrayAsync(ct);

内容的提问来源于stack exchange,提问作者Diego Perez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 07:15:59