如何在 LINQ 中过滤具有不同参数的列表

杰森

假设我有一个这样的类:

public class SampleClass
{
    public string SampleProperty1 { get; set; }
    public string SampleProperty2 { get; set; }
    public string SampleProperty3 { get; set; }
    public string SampleProperty4 { get; set; }
    public string SampleProperty5 { get; set; }
}

我有一个这样的清单:

List<SampleClass> sampleList = new List<SampleClass>();

我想通过SampleProperty1过滤该列表SampleProperty5下次我会使用SampleProperty3or SampleProperty2我的意思是用户可以按他想要的任何属性进行过滤。

我怎样才能实现这种灵活性?

我不想编写与属性一样多的 if 语句,因为实际的属性数量要多得多。

有没有聪明的方法来做到这一点?

谢谢。

无代号

您可以为每个属性构建 lambda 表达式并使用它过滤集合。假设您有Dictionary一些属性名称及其要过滤的值:

var filters = new Dictiontionary<string, object>();
IEnumerable<SampleClass> query = listOfSampleClasses;

// we will loop through the filters
foreach(filter in filters)
{
    // find the property of a given name
    var property = typeof(SampleClass).GetProperty(filter.Key, BindingFlags.Instance | BindingFlags.Public);
    if (property == null) continue;

    // create the ParameterExpression
    var parameter = Expression.Parameter(typeof(SampleClass));
    // and use that expression to get the expression of a property
    // like: x.SampleProperty1
    var memberExpression = Expression.Property(parameter, property);

    // Convert object type to the actual type of the property
    var value = Convert.ChangeType(filter.Value, property.PropertyType, CultureInfo.InvariantCulture);

    // Construct equal expression that compares MemberExpression for the property with converted value
    var eq = Expression.Equal(memberExpression, Expression.Constant(value));

    // Build lambda expresssion (x => x.SampleProperty == some-value)
    var lambdaExpression = Expression.Lambda<Func<SampleClass, bool>>(eq, parameter);

    // And finally use the expression to filter the collection
    query = query.Where(lambdaExpression);
}

var filteredList = query.ToList();

当然,您可以将该代码放在任何类型的泛型方法和过滤器集合中。

对于输入字典,包含两对:"SampleProperty1" - "foo""SampleProperty2" - "bar"它会产生类似的东西:

listOfSampleClasses
    .Where(x => x.SampleProperty1 == "foo")
    .Where(x => x.SampleProperty2 == "bar");

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用管道过滤具有不同参数的数组

来自分类Dev

我们如何在 Linq 中过滤具有多个 if 条件的列表

来自分类Dev

如何在具有不同参数和别名的列中执行SELECT?

来自分类Dev

如何在字典中存储具有不同参数的通用动作?

来自分类Dev

如何在Matlab中重新运行具有不同参数的程序?

来自分类Dev

如何在LINQ中查询?

来自分类Dev

如何在LINQ中输入?

来自分类Dev

Linq如何在select中传递参数

来自分类Dev

如何在linq中构造对象列表

来自分类Dev

如何从网页中对具有多个不同参数的JSON进行排序?

来自分类Dev

如何从网页中对具有多个不同参数的JSON进行排序?

来自分类Dev

如何传递具有不同值的相同参数

来自分类Dev

java:如何复制具有不同参数类型的值

来自分类Dev

C#WPF Linq连接4个表以及具有不同参数的Where

来自分类Dev

如何在 gnuplot 上绘制具有不同参数值的函数?

来自分类Dev

SQL 查询到 LINQ 如何在 linq 中编写查询

来自分类Dev

Sql 到 linq(如何在 Linq 中编写 Sql 查询)

来自分类Dev

如何在同一 linq 链中引用 linq 集合?

来自分类Dev

如何在Linq中实现嵌套的for循环?

来自分类Dev

如何在排名中执行linq查询?

来自分类Dev

如何在LINQ Select中调用方法

来自分类Dev

如何在LINQ中随机使用First()?

来自分类Dev

如何在Linq中编写SQL Concat?

来自分类Dev

如何在LINQ中包含多个级别?

来自分类Dev

如何在LINQ中对范围进行分组

来自分类Dev

如何在LINQ中实现groupby

来自分类Dev

如何在 linq 中重现 MySQL 语句

来自分类Dev

如何在 LINQ 中撤消跳过/接受?

来自分类Dev

如何在 LinQ 中调用函数

Related 相关文章

热门标签

归档