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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 01:05:22