12

我遇到了扩展方法解析的问题。LINQ 和 MoreLINQ 包含zip方法,它从4.0版本开始存在于 .NET 中,并且始终存在于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>)'

我在这篇文章中找到了 Jon Skeet 为 MoreLINQ 制作的Concat方法的良好分辨率,但我不知道方法的良好分辨率。stringzip

注意:您始终可以使用静态方法调用语法,并且一切正常

MoreEnumerable.Zip(students, colors, (s, c) => s + c )

但有点错过了扩展语法糖的意义。如果您使用 LINQ 和 MoreLINQ 调用进行大量数据转换 - 您不想在中间使用静态方法调用。

有没有更好的方法来解决这种歧义?

4

5 回答 5

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);
    }
}
于 2013-01-18T10:50:13.343 回答
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

于 2013-01-18T11:18:00.503 回答
1

更新你的 morelinq,从现在开始

  • 用于Zip.NET 4.0 Zip
  • 用于ZipShortestMoreLinq 邮编

问题已在88c573f7中修复

于 2013-09-29T12:37:00.963 回答
0

不幸的是,静态方法调用语法是这里唯一的方法。

于 2013-01-18T10:46:35.627 回答
0

前几天我遇到了这个问题,我只是直接调用了 MoreLinq 方法。

MoreLinq.MoreEnumerable.Zip(students, colors, (s, c) => s + c);
于 2019-11-25T16:53:00.687 回答