【问题标题】:Extension method with Lambda/Selector/Predicate logic具有 Lambda/选择器/谓词逻辑的扩展方法
【发布时间】:2011-06-10 22:46:18
【问题描述】:

我正在尝试将以下逻辑放入一个扩展方法中,让我为字段的选择器传入一个 Func。

public class MyClass {
    public decimal someValue {get; set;}
}

public class NumericSearch {
    decimal searchValue {get; set;}

    // Will be =, <=, >=, >, <
    string searchType {get; set;} 
}

... 

List<MyObject> listOfClass = { ... };

if (search.searchType == "=") {
    listOfClass = listOfClass.Where(l=>l.someValue == 123).ToList();
} else if (search.searchType == "<=") {
    listOfClass = listOfClass.where(l=>l.someValue <= 123).ToList();
} else if (...){
    ...
}

我的目标是能够这样称呼它:

var filteredList = listOfClass.applyNumericSearch(l=>l.someValue, new NumericSearch() { searchValue = 123, searchType = "<="} );

到目前为止,我的方法签名看起来像这样,但我不确定如何处理 Lamda /selection 部分以实际完成我想要完成的工作:

public static IEnumerable<TSource> applyNumericSearch<TSource>(this IEnumerable<TSource> source, Func<TSource, decimal> selector, NumericSearch search) {

【问题讨论】:

    标签: c#-4.0 lambda extension-methods


    【解决方案1】:
    public static IEnumerable<TSource> applyNumericSearch<TSource>(
        this IEnumerable<TSource> source,
        Func<TSource, decimal> selector,
        NumericSearch search
    ) {
        var projection = source.Select(x => selector(x));
        if(search.searchType == "<=") {
            return projection.Where(y => y <= search.searchValue);
        }
        // etc.
    }
    

    此外,我强烈考虑将searchType 设为枚举实例

    public enum SearchType {
        LessThan,
        LessThanOrEqual,
        Equal,
        GreaterThan,
        GreaterThanOrEqual,
        NotEqual
     };
    

    而不是使用string

    【讨论】:

    • 有一个问题:您实际上是在返回值而不是源类型。
    • 谢谢 Jason,我确实计划使用枚举作为搜索类型,我只是想让我的代码发布简短;)
    【解决方案2】:

    如果您真的想使用 string 查询,请查看 Dynamic LINQ 库。

    如果你对 lambdas 没问题,只需使用不同的谓词:

    Func<decimal, bool> BuildPredicate (NumericSearch search)
    {
        switch (search.Kind) {
            case SearchKind.Equal:
                return (x => x == search.Value);
            case SearchKind.LessThan:
                return (x => x < search.Value);
            // ...
        }
    }
    
    // in ApplyNumericSearch
    var predicate = BuildPredicate (search);
    return source.Where (x => predicate (selector (x));
    

    但这不适用于数据库。

    【讨论】:

    • 这适用于非数据库查询吗?无论哪种方式,这对于我的情况都不是一个理想的方法,但感谢您的建议。
    • 它适用于任何 LINQ 提供程序。至于您的需求,您可以根据 NumericSearch 获取不同的 lambda,并将它们提供给 Where
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多