Как разрешить неоднозначный вызов ZIP между Enumerable и MoreLINQ?

У меня возникла проблема с разрешением метода расширения. LINQ и MoreLINQ содержат метод zip, он присутствует в .NET с версии 4.0 и всегда находился в MoreLINQ библиотека. Но вы не можете использовать одну из реализаций с сильным синтаксисом nice-old extension. Таким образом, этот код не будет компилировать

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 для MoreLINQ, сделанного Джоном Скитом в этом сообщении, но я не знаю о хорошем разрешение для метода zip.

ПРИМЕЧАНИЕ.. Вы всегда можете использовать синтаксис вызова static method, и все это отлично работает с

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

но немного пропускает точку синтаксиса синтаксиса расширения. Если у вас много преобразований данных с вызовами LINQ и MoreLINQ, вы не хотите использовать статический вызов метода посередине.

Есть ли более эффективные способы решения этой двусмысленности?

Ответ 1

Способ компиляции:

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

Вы можете создать класс-оболочку с тем же методом, но с другим именем. Это немного грязно, но если вам действительно нравится иметь синтаксис расширения, это единственный способ.

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);
    }
}

Ответ 3

К сожалению, синтаксис вызова статического метода является единственным способом здесь.

Ответ 4

Обновите свой morelinq, и теперь

  • Используйте Zip для .NET 4.0 Zip
  • Используйте ZipShortest для MoreLinq Zip

Проблема исправлена ​​в a079bd816594