c# - 我可以动态地将参数添加到 IEnumerable.Any 方法的 LINQ 查询吗?

标签 c# linq

我创建了一个接受动态列表、对象和两个参数名称的方法。我想使用 Enumerable.Any 方法返回一个 bool 值,该方法具有基于传递给方法的参数名称的匹配条件。

public static bool CheckDuplicate(List<T> list, Object obj, string param1, string param2)
{
    return list.Any(item => item.pararm1 = obj.param1 && item.param2 = obj.param2);
}

我想根据动态提供的条件找到与obj对象的值匹配的项目。

最佳答案

似乎您想要的是比较通过成员变量的名称访问的成员变量。这称为反射。这是我的解决方案:

首先添加一个扩展方法来帮助我们通过名称获取成员变量(来自 this SO answer ):

static class Extension
{
    public static object GetPropValue(this object src, string propName)
    {
        return src.GetType().GetProperty(propName).GetValue(src, null);
    }
}

那么,你的函数将是:

public static bool CheckDuplicate<T>(IEnumerable<T> list, object obj, string param1, string param2)
    {
        return list.Any(item =>
        item.GetPropValue(param1).Equals(obj.GetPropValue(param1)) &&
        item.GetPropValue(param2).Equals(obj.GetPropValue(param2))
        );
    }

我用这个测试了这个功能。它打印 True:

static void Main(string[] args)
    {
        var theList = Enumerable.Range(0, 10).Select(i => new Tuple<int, int>(i, i + 1));
        Console.WriteLine(CheckDuplicate(theList, new { Item1 = 5, Item2 = 6 }, "Item1", "Item2"));
        Console.ReadKey();
    }

但是,在生产中使用时,您可能需要确保 param1param2 实际存在,并且还请查找并考虑 之间的差异。 Equals()==。注意到 GetPropValue() 返回的值被装箱可能会很有用。

关于c# - 我可以动态地将参数添加到 IEnumerable.Any 方法的 LINQ 查询吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55847422/

相关文章:

c# - 用于准确检测 "071-XXXXXXX"的正则表达式,其中 X 是数字

c# - Unity3D。试图在未经授权的情况下为对象发送命令

c# - 是否有可能在 DataGridView 中有一列用作允许用户输入新值的组合框?

c# - LINQ To SQL 会在调用 SubmitChanges 后自动更新 LOCAL/CLIENT id 列吗?

c# - ASP.NET MVC动态绑定(bind)编辑器模板

c# - COM 互操作并行程序集

c# - Linq to Mongodb动态更新功能

c# - 数据成员密码未经过哈希处理?

c# - 在 c# 中这个查询的 LINQ 解决方案是什么?

c# - 使用 Entity Framework 从关联中获取 ID