如何为< T>创建表达式过滤器列表比较? [英] How to create Expression filter for <T> List Comparison?

查看:69
本文介绍了如何为< T>创建表达式过滤器列表比较?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有下面的列表比较功能

I have a list comparison function which is given below

public delegate bool CompareValue<in T1, in T2>(T1 val1, T2 val2);
    public static bool CompareTwoLists<T1, T2>(IEnumerable<T1> list1, IEnumerable<T2> list2, CompareValue<T1, T2> compareValue)
    {
        return list1.Select(item1 => list2.Any(item2 => compareValue(item1, item2))).All(search => search)
                && list2.Select(item2 => list1.Any(item1 => compareValue(item1, item2))).All(search => search);
    }

此函数的调用方式如下

bool IsSuccess1 = ListComparison.CompareTwoLists(listProduct, listProduct2, (listProductx, listProductx2) => listProductx.ProductName == listProductx2.ProductName);

这里的委托表达式现在是静态的.这用于比较两个列表项中的特定列.如何基于列表动态创建以上代码

Here delegate expression is static now. This is using to compare a particular column in two list items. How to create above code dynamically based on a list

List<CompareColumns> listCompareColumns = new List<Classes.CompareColumns>(); 

CompareColumns objDup1 = new CompareColumns(); 
objDup1.Columns = "ProductName"; 

CompareColumns objDup2 = new CompareColumns(); 
objDup2.Columns = "ProductCode"; 

listCompareColumns.Add(objDup1); 
listCompareColumns.Add(objDup2);

上面的列表可能有一个或多个列.我们需要在比较列表中比较这些列.基于上面的列表如何动态生成下面的代码?

Above list may have one or more columns. We need to compare these columns in the comparison lists. based on the above list how to generate below code dynamically?

(listProductx, listProductx2) => listProductx.ProductName == listProductx2.ProductName && listProductx.ProductCode == listProductx2.ProductCode && etc....

推荐答案

如果要多次使用比较函数(CompareValue<T1, T2> compareValue),则创建一个表达式并将其编译是有意义的.这是一个示例:

If you are going to use the comparison function (CompareValue<T1, T2> compareValue) a lot of times, then it would make sense to create an expression and compile it. Here is an example:

public static CompareValue<T1, T2> CreateComparer<T1, T2>(List<CompareColumns> columns)
{
    var propertyNames = columns.Select(x => x.Columns).ToList();

    var param1 = Expression.Parameter(typeof (T1), "val1");
    var param2 = Expression.Parameter(typeof (T2), "val2");

    var expressionBody =
        propertyNames
            .Select(propertyName =>
                Expression.Equal(
                    Expression.Property(param1, propertyName),
                    Expression.Property(param2, propertyName)))
            .Aggregate(Expression.AndAlso);

    return
        Expression
            .Lambda<CompareValue<T1, T2>>(
                expressionBody,
                param1,
                param2)
            .Compile();
}

这里是使用方法:

List<CompareColumns> columns = ...

var func = CreateComparer<Class1,Class2>(columns);

var result = CompareTwoLists<Class1,Class2>(listOfClass1, listOfClass2 , func);

这篇关于如何为&lt; T&gt;创建表达式过滤器列表比较?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆