我遇到了扩展方法解析的问题。 LINQ和MoreLINQ包含zip
方法,它存在于.NET中,因为 4.0 版本并且始终位于MoreLINQ库中。但是您不能使用具有良好旧扩展方法语法的实现之一。所以这段代码不会编译
using MoreLinq;
using System.Linq;
var students = new [] { "Mark", "Bob", "David" };
var colors = new [] { "Pink", "Red", "Blue" };
students.Zip(colors, (s, c) => s + c );
错误:
The call is ambiguous between the following methods or properties:
'MoreLinq.MoreEnumerable.Zip<string,string,string>
(System.Collections.Generic.IEnumerable<string>,
System.Collections.Generic.IEnumerable<string>, System.Func<string,string,string>)' and
'System.Linq.Enumerable.Zip<string,string,string>
(System.Collections.Generic.IEnumerable<string>,
System.Collections.Generic.IEnumerable<string>, System.Func<string,string,string>)'
我已经在Concat
找到了string
for zip
方法的解决方案,以获得由Jon Skeet在this post制作的MoreLINQ,但我不知道MoreEnumerable.Zip(students, colors, (s, c) => s + c )
的良好解决方案方法。
注意:您始终可以使用静态方法调用语法,并且一切正常
{{1}}
但是忽略了扩展语法糖的一点点。如果您使用LINQ和MoreLINQ调用进行大量数据转换 - 您不希望在中间使用静态方法调用。
有没有更好的方法来解决这种歧义?
答案 0 :(得分:4)
您可以使用相同的方法创建包装类,但名称不同。它有点脏,但如果你真的想要扩展语法,那是唯一的方法。
public static class MoreLinqWrapper
{
public static IEnumerable<TResult> MlZip<TFirst, TSecond, TResult>(this IEnumerable<TFirst> first, IEnumerable<TSecond> second, Func<TFirst, TSecond, TResult> resultSelector)
{
return MoreLinq.Zip(first, second, resultSelector);
}
}
答案 1 :(得分:4)
使其编译的方法是:
var students = new[] { "Mark", "Bob", "David", "test" }.AsQueryable();
var colors = new[] { "Pink", "Red", "Blue" };
students
.Zip(colors, (s, c) => s + c)
.Dump();
students
对象必须转换为IQueryable
对象。
答案 2 :(得分:1)
不幸的是,静态方法调用语法是这里的唯一方法。
答案 3 :(得分:1)
答案 4 :(得分:0)
前几天我遇到了这个问题,我直接直接调用了MoreLinq方法。
MoreLinq.MoreEnumerable.Zip(students, colors, (s, c) => s + c);