【发布时间】:2016-09-12 02:55:04
【问题描述】:
static Func<T, object> CreateSelector<T>(IEnumerable<string> propertyNames)
{
var sourceType = typeof(T);
var parameter = Expression.Parameter(sourceType, "e");
var properties = propertyNames.Select(name => Expression.PropertyOrField(parameter, name)).ToArray();
var selector = Expression.Lambda<Func<T, object>>(
Expression.Call(typeof(Tuple), "Create", properties.Select(p => p.Type).ToArray(), properties),
parameter);
return selector.Compile();
}
public static IEnumerable<Tuple<T, T>> Join<T>(this IEnumerable<T> left, IEnumerable<T> right, IEnumerable<string> propertyNames)
{
var keySelector = CreateSelector<T>(propertyNames);
return left.Join(right, keySelector, keySelector, Tuple.Create);
}
public static bool CompareLists<T1, T2>(IEnumerable<T1> lstProduct1, IEnumerable<T2> lstProduct2, List<DuplicateExpression> DuplicateExpression)
{
string[] Fields = DuplicateExpression.Select(x => x.ExpressionName).ToArray();
var JoinExp = lstProduct1.Join(lstProduct2, Fields);
bool IsSuccess = true;// CompareTwoLists(lstProduct1, lstProduct2, (listProductx1, listProductx2) => JoinExp.Any());
return IsSuccess;
}
当我编译上面的代码时;我在下面的行中遇到错误
var JoinExp = lstProduct1.Join(lstProduct2, Fields);
错误是
错误 1 方法的类型参数 'AP.Classes.ListComparison.Join(System.Collections.Generic.IEnumerable, System.Collections.Generic.IEnumerable, System.Collections.Generic.IEnumerable)' 无法推断 从用法上。尝试指定类型参数 明确地。 D:\Workshop\Ap\Classes\DuplicateValidator.cs
如何解决这个错误?我正在创建一个列表比较工具。
【问题讨论】:
-
看看你的
Join方法 - 它需要 one 类型的参数。它希望您的两个序列属于同一类型。您的CompareLists方法允许两个序列属于 不同 类型。你想达到哪个目标? -
bool IsSuccess =CompareTwoLists(lstProduct1, lstProduct2, (listProductx1, listProductx2) => JoinExp.Any());我正在将这两个lists传递给具有该连接的另一个函数。两个列表具有相同的属性。 -
你错过了我的意思。在您的
CompareLists方法中,lstProduct1和lstProduct2可以是不同的类型——例如,您可以调用CompareLists(new List<string>(), new List<int>(), null);。但是在CompareLists中,您调用的是Join,它需要两个相同 元素类型的序列...两个参数都是IEnumerable<T>。现在,您希望能够连接具有不同元素类型的序列吗?如果是这样,请更改Join。如果没有,请更改CompareLists。 -
我是自定义
Join方法的作者(作为对您之前问题的回答),我应该说假设您要加入两个相同类型的列表。如果它们不同,则该方法应该具有不同的签名和实现。由于您针对同一主题发布了多个问题,因此如果您提供您想要实现的目标的示例,而不是实施尝试,那就太好了。 -
您是否正在寻找像
public static bool CompareTwoLists<T1, T2>(IEnumerable<T1> list1, IEnumerable<T2> list2, Enumerable<string> propertyNames)这样的方法,如果基于指定的属性有任何差异,则返回true?