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
相关产品推荐
相关产品推荐

