12

拡張メソッドの解決で問題が発生しました。LINQ と MoreLINQ にはメソッドが含まれており、 4.0バージョンzipから .NET に存在し、常にMoreLINQライブラリにありました。しかし、古き良き拡張メソッド構文で実装の 1 つを使用することはできません。したがって、このコードはコンパイルされません

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

コンパイルする方法は次のとおりです。

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 に答える
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 に答える
1

morelinq を更新して、今から

  • Zip.NET 4.0 Zip に使用
  • ZipShortestMoreLinq Zip に使用

問題は88c573f7で修正されています

于 2013-09-29T12:37:00.963 に答える
0

残念ながら、ここでは静的メソッド呼び出し構文が唯一の方法です。

于 2013-01-18T10:46:35.627 に答える