Как разрешить неоднозначный вызов 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