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

C#如何将多个布尔类型的过滤方法合并为单个通用方法

C# 多参数过滤方法合并实现

我创建了四个方法来实现基于多参数的过滤功能,代码如下:

bool FilterAreas(AreaPlaceCoordinate apc)
{
    if (!AreaHash.Any())
    {
        return true;
    }
    foreach (var _ in AreaHash.Where(h => apc.AreaName.Contains(h, StringComparison.OrdinalIgnoreCase)).Select(h => new { }))
    {
        return true;
    }
    return false;
}
bool FilterPlaces(AreaPlaceCoordinate apc)
{
    if (!PlaceHash.Any())
    {
        return true;
    }
    foreach (var _ in PlaceHash.Where(h => apc.PlaceName.Contains(h, StringComparison.OrdinalIgnoreCase)).Select(h => new { }))
    {
        return true;
    }
    return false;
}
bool FilterCoordinates(AreaPlaceCoordinate apc)
{
    if (!CoordinateHash.Any())
    {
        return true;
    }
    foreach (var _ in CoordinateHash.Where(h => apc.CoordinateName.Contains(h, StringComparison.OrdinalIgnoreCase)).Select(h => new { }))
    {
        return true;
    }
    return false;
}
bool Filter(AreaPlaceCoordinate apc)
{
  return FilterCoordinates(apc) && FilterPlaces(apc) && FilterAreas(apc);
}

我认为上述逻辑可以合并为一个方法,但多次尝试都未成功实现。示例中用到的相关对象定义如下:

//Hash
private IEnumerable<string> PlaceHash { get; set; } = new HashSet<string>() { };
private IEnumerable<string> AreaHash { get; set; } = new HashSet<string>() { };
private IEnumerable<string> CoordinateHash { get; set; } = new HashSet<string>() { };
public class AreaPlaceCoordinate
{
    public int CoordinateId { get; set; }
    public string CoordinateName { get; set; }
    public int AreaId { get; set; }
    public int PlaceId { get; set; }
    public string AreaName { get; set; }
    public string PlaceName { get; set; }
}

希望各位可以提供可行的实现思路。

更新

感谢@Abanslash的解答!我额外添加了字符串文本过滤功能,最终实现代码如下:

private string searchString1 = "";
static bool FilterHash<T>(IEnumerable<string> list, T viewModel, Func<string, bool> p)
{
    if (!list.Any())
    {
        return true;
    }
    return list.Any(p);
}
public bool TestFilter(AreaPlaceCoordinate apc)
{
    bool textEmpty = (string.IsNullOrWhiteSpace(searchString1));
    List<string> names = new() { apc.AreaName, apc.PlaceName, apc.CoordinateName };
    bool filterText = textEmpty ? true : names.Any(n => n.Contains(searchString1, StringComparison.OrdinalIgnoreCase));
    bool areaSelector(string str) => apc.AreaName.Contains(str);
    bool coordinateSelector(string str) => apc.CoordinateName.Contains(str);
    bool placeSelector(string str) => apc.PlaceName.Contains(str);
    return FilterHash(AreaHash, apc, areaSelector) && FilterHash(CoordinateHash, apc, coordinateSelector) && FilterHash(PlaceHash, apc, placeSelector) && filterText;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 18:36:03