我可以为 IEnumerable.Any 方法动态添加参数到 LINQ 查询吗?

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


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 对象匹配的值的项目。


冉冉说
浏览 106回答 2
2回答

拉莫斯之舞

似乎您想要的是比较通过成员变量的名称访问的成员变量。这称为反射。这是我的解决方案:首先添加一个扩展方法来帮助我们通过名称获取成员变量(来自this SO answer):static class Extension{&nbsp; &nbsp; public static object GetPropValue(this object src, string propName)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return src.GetType().GetProperty(propName).GetValue(src, null);&nbsp; &nbsp; }}然后,您的功能将是:public static bool CheckDuplicate<T>(IEnumerable<T> list, object obj, string param1, string param2)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return list.Any(item =>&nbsp; &nbsp; &nbsp; &nbsp; item.GetPropValue(param1).Equals(obj.GetPropValue(param1)) &&&nbsp; &nbsp; &nbsp; &nbsp; item.GetPropValue(param2).Equals(obj.GetPropValue(param2))&nbsp; &nbsp; &nbsp; &nbsp; );&nbsp; &nbsp; }我用这个测试了这个功能。它打印True:static void Main(string[] args)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var theList = Enumerable.Range(0, 10).Select(i => new Tuple<int, int>(i, i + 1));&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(CheckDuplicate(theList, new { Item1 = 5, Item2 = 6 }, "Item1", "Item2"));&nbsp; &nbsp; &nbsp; &nbsp; Console.ReadKey();&nbsp; &nbsp; }但是,对于生产中的使用,您可能希望确保param1和确实存在,并且还请查找并考虑和param2之间的差异。注意从中返回的值是装箱的可能很有用。.Equals()==GetPropValue()

慕丝7291255

考虑创建一个类似 LINQ 的扩展方法WhereAll,它执行Where作为参数给出的所有谓词:static IEnumerable<TSource> WhereAll<TSource>(this IEnumerable<TSource> source&nbsp; &nbsp;IEnumerable<Func<TSource, bool>> predicates){&nbsp; &nbsp; // TODO: exception if source / predicates null&nbsp; &nbsp; // return all source elements that have a true for all predicates:&nbsp; &nbsp; foreach (var sourceElement in source)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; // check if this sourceElement returns a true for all Predicates:&nbsp; &nbsp; &nbsp; &nbsp; if (predicates.All(predicate => predicate(sourceElement))&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// yes, every predicate returns a true&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;yield return sourceElement;&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; // else: no there are some predicates that return false for this sourceElement&nbsp; &nbsp; &nbsp; &nbsp; // skip this element&nbsp;}用法:List<Person> persons = ...// Get all Parisians with a Name that were born before the year 2000:var result = persons.WhereAll(new Func<Person, bool>[]&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;person => person.Name != null,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;person => person.BirthDay.Year < 2000,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;person => person.Address.City == "Paris",&nbsp; &nbsp; });
打开App,查看更多内容
随时随地看视频慕课网APP