C#中能否用FilterDetail实例方法替代静态委托用于Linq查询?
问题描述
现有FilterDetail类包含如下Locations属性:
public IEnumerable<string> Locations => new List<string> { AsOne, AsTwo, AsThree, AsFour, AsFive, AsSix };
当前使用静态委托实现位置过滤逻辑:
public static Func<FilterDetail, string, bool> LocationFilter = (item, loc) => item.Locations.Any(x => x.Equals(loc, StringComparison.OrdinalIgnoreCase));
视图中的调用方式为:
calls = calls.Where(x => FilterDetail.LocationFilter(Filter, x.Location_Abbr));
希望简化该实现,改为实例方法调用以消除视图/UI代码中的查询复杂度,询问是否可通过Linq直接使用FilterDetail实例(Filter)的方法达成需求。
解决方案
完全可以通过封装实例方法实现,以下是具体改造步骤:
1. 在FilterDetail类中添加实例方法
将过滤逻辑封装到FilterDetail类内部,新增一个实例方法负责判断位置是否匹配:
public class FilterDetail { // 保留原Locations属性(可按需优化,见下文) public IEnumerable<string> Locations => new List<string> { AsOne, AsTwo, AsThree, AsFour, AsFive, AsSix }; // 新增实例方法:验证传入的位置缩写是否匹配当前实例的Locations列表 public bool MatchesLocation(string locationAbbr) { return Locations.Any(x => x.Equals(locationAbbr, StringComparison.OrdinalIgnoreCase)); } }
2. 视图中简化Linq调用
现在可以直接通过Filter实例调用方法,Linq查询逻辑会更简洁直观:
calls = calls.Where(x => Filter.MatchesLocation(x.Location_Abbr));
额外性能优化
原Locations属性每次访问都会新建List<string>对象,若过滤方法调用频繁,建议改为预初始化的只读列表,避免重复创建对象:
// 改为私有只读字段存储列表,公共属性只读返回 private readonly List<string> _locations = new List<string> { AsOne, AsTwo, AsThree, AsFour, AsFive, AsSix }; public IEnumerable<string> Locations => _locations;
这样改造后,过滤逻辑被封装在FilterDetail类内部,视图代码仅需关注业务调用,彻底消除了原静态委托带来的冗余复杂度。
内容的提问来源于stack exchange,提问作者Scott Hoffman
相关产品推荐
相关产品推荐

