2009-05-25 6 views
0
における方法

の匿名メソッドの記述:は、私は次のコード(IEnumerableをを返すメソッドを呼び出す)を持ってIEnumerableを

FibonacciWithLinq.Skip(delegate() { 

              return 5; 

    } 
     ); 

スキップのためのパラメータはint型(スキップするアイテムの数を)取ります。私はこの数を決定する別個の機能を持つことができます(それはいくつかの要因に依存するかもしれません)。ただし、メソッドがSkip()メソッドによって消費される場合は、それをanonメソッドとして記述するとよいでしょう。問題は、上記のコードでは、私はこのエラーが表示されます:

型引数は、使用から推測することはできません。型引数を明示的に指定してみてください。

しかし、私は上記のコードで何か間違って見ることはできません。私に何ができる?私は確かに上記のシナリオのためにanonメソッドを書くことができますか?私は非常に誤解していない限り

おかげで

+0

スキップはどのように定義されていますか? –

+0

それはここで定義されています:http://msdn.microsoft.com/en-us/library/bb358985.aspx引数として代理人を取るのではなく、数字だけです。 –

答えて

3

「値」と「値を返す引数なしで機能」(のはFunc<T>それを呼びましょう)の間には自動変換はありません、また逆方向への自動変換があります。

Func<T>を値Tに変換するには、()を入力する必要があります。値をFunc<T>に変換するには、() =>をその前に置くことができます。

あなたがFunc<T>を受け入れるいくつかのメソッドを呼び出したい場合は、Func<T>にその値を変換する必要がありますので、あなたが直接、値を渡すことができない、とあなたはそれの前に() =>を置くことができることをやって。

あなたが値を受け取り、いくつかのメソッドを呼び出したい場合は、あなたが直接Func<T>を渡すことはできませんので、あなたはそれの後に()を置くことによって値にそのFunc<T>を変換する必要があります。

いくつかの言語はこれらの間で自動的に変換しますが、C#では変換しません。

あなたの場合、値を受け取り、それに関数を渡そうとしています。値をすでに持っていても、それを渡すことは特別なことをする必要はありません。値を関数に渡します。

int val = 5;    // value 
Func<int> f =() => val; // convert value to function 
int val2 = f();   // convert back to value 

「匿名メソッド」構文は、これを行うだけの醜い古い方法です。あなたがしようとしていることには2つの問題があります(それが不要であることは別として)。

最初に、new Func<int>(...)ラッパーを持つデリゲート型を明示的に指定することによって、コンパイラに型ヒントを与える必要があります。

次に、()を追加して値を取得する必要があります。

FibonacciWithLinq.Skip(new Func<int> 
         (delegate() 
         { 
          return 5; 
         })()); 

しかし、それは十分に強調することはできません - これは完全に無意味です。

1

、正しいコードはちょうどです:

FibonacciWithLinq.Skip(5); 

EDIT :: ああは、あなただけの間接のために間接をしたいです。 5つの要素をスキップしているので、私は間接指向の5レベルで十分ですと思いますか?あなたはスキップするどのように多くの決定と何かを持っている場合は

IEnumerable<int> FibannociSkip = new int[]{0, 1, 1, 2, 3, 5}; 
Func<Func<Func<Func<Func<int>>>>> f =()=>(()=>(()=>(()=>(()=>5)))); 
foreach(var num in FibannociSkip.Skip(f()()()()())) 
    Console.WriteLine(num); 
+0

これは完全に合法ですが、匿名メソッドを使用できない場合はどうしてですか? – dotnetdev

+0

C#またはLispですか? ; p – johnc

+0

私はそれを褒め言葉として取り上げます。 ;) –

2

は、単に書く...あなたがより多く必要な場合は、私に教えてください:

FibonacciWithLinq.Skip(HowManyToSkip()) 

をそれとも、それは別の方法でパラメータ化したいですか、

Func<int, IEnumerable<int>> skipper = x => FibonacciWithLine.Skip(x); 
foreach (var i in skipper(5)) Console.WriteLine(i); 

問題のコードは、Skipが望むものではなく、定数のint値の代わりにメソッドに渡しています。おそらく、あなたは順序で返された値をスキップする:もしそうなら、除いて()拡張メソッドは、あなたが望むものである:ラムダ構文はのためにわずかである

FibonacciWithLinq.Except(x => (x == 5 || x == 7)); 

注:

FibonacciWithLinq.Except(delegate(int x) { return x==5||x==7; }); 
2

あなたの場合スキップして関数を引数として取る必要がある場合は、これを行う拡張を記述し、デリゲートまたはラムダを使用して省略したい要素をスキップするための評価関数を提供する必要があります。

public static class IEnumerableExtensions 
{ 
    public static IEnumerable<T> Skip(this IEnumerable<T> source, Func<int> toSkip) 
    { 
     return source.Skip(toSkip()); 
    } 
} 

FibonacciWithLinq.Skip(() => { return 5; }); 
+0

+1直接的な答えです。ありがとう! – dotnetdev

1
Func<int> f =() => 5; 
FibonacciWithLinq.Skip(f()); 
関連する問題