2016-12-27 8 views
-1

こんにちは私はリストのフィルタシステムを作成しようとしています。C#ラムダ変換

Error CS1660: Cannot convert lambda expression to type 'bool' because it is not a delegate type 

私はそのような方法で何かに実際のフィルタリングを行うだろう持っている:

public bool filter(String fieldName, double? value) 
public bool filter(String fieldName, int? value) 
public bool filter(String fieldName, Date? value) 

list.Remove(this.filter(fieldName, Convert.ToDouble(o => rule(o)))); 

は、私は、エラーメッセージが表示されます。この行で

public void filter<T, E>(String fieldName, List<T> list, Func<T, E> rule) 
{ 
    IList<FilterDto> filters = GetFilter(fieldName); 
    foreach (FilterDto filter in filters) 
    { 
     if (filter != null) 
     { 
      if (filter.valueType == ValueType.NUMERIC) 
      { 
       list.Remove(this.filter(fieldName, Convert.ToDouble(o => rule(o)))); 
      } 
      else if (filter.valueType == ValueType.DATE) 
      { 
      } 
      else if (filter.valueType == ValueType.TEXT) 
      {  
      } 
      else 
      { 
       Log("Unkown filter comparsion"); 
      } 
     } 
    } 
} 

+1

あなた 'ルール()'メソッドとは何ですか?それは何を返すのですか? –

+0

私の質問を編集:) – Flo

答えて

-1

...私はREMOVEALLを使用する必要があります。私の最高の推測では、(あなたの質問があり、非常に明確ではないので、それは推測である必要があります)この近くにあなたが意図何かということです。そのような

list.RemoveAll(o => this.filter(filter, Convert.ToDouble((rule(o) as Double?)))); 
2

最終行の過負荷はありませんConvert.ToDouble()はラムダ式を引数として取ります。コンパイラは、基本的にオーバーロードの1つ(この場合はbool)をとり、ラムダをboolに変換できないことを伝えています。

rule()の戻り値を変換しようとしていますか?もしそうなら、単にrule()自分自身を呼び出して、あなたは(あなたの質問からは不明)、それを渡す必要があるものは何でもVARそれを渡す:

list.Remove(this.filter(fieldName, Convert.ToDouble(rule(yourVar)))); 
+0

リストの各要素のthis.filter(fieldName、...)に行きます。私はこれにどのようにすることができますか? – Flo

+0

また、 "yourVar"はリストのすべての要素である必要があります。 – Flo

0

あなたはあまり意味がありません何をすべきか。あなたの喜劇(または悲劇 - あなたが選ぶ)には、以下の俳優がいます:

  1. IList<FilterDto>は、フィルターオブジェクトのコンテナーです。
  2. 皆を一緒に保つ方法です。filter
  3. filterローカル変数は、同じ名前を持つため、(1)に存在し、(2)に対して恨みを持ちます。
  4. Convert.ToDoubleこのメソッドは、パラメータの引数として誰も受け入れないため、歌姫のビットです。
  5. Removeの方法、(1)の息子。
  6. o => rule(o)ラムダ式。

IList(1)と入力します。それを反復してfilter(3)変数を作成します。今すぐRemoveというメソッド(5)が呼び出されます。これは実際には行っていないfilter(3)を削除する可能性があります。代わりに、filter(2)はの結果()を持たないため、filterのメソッド(2)の結果を削除するのは残念です。しかし、filter(2)は、の最初の呼び出しとして同じTEとは限りませんが、第2引数としてFunc<T, E>が必要です。あなたのエラーはFunc<T, E>ではないdoubleの結果を持つ悪いToDouble(4)が来るので、あなたのエラー。状況を悪化させるために、o => rule(o)(6)はToDoubleの引数リスト(4)に入ります。今度はaFunc<T, E>ですが、熱心に試してもdoubleに変換できないため、ToDouble(4)はそれほど多くのことをすることはできません。

このゴードンノットをどのようにカットするのですか?

よく見るように、フィルタルールへの後続の呼び出しが成功した場合は、IList(1)からアイテムを削除することができます。私は私のミスを見つけた

T[] itemsToRemove = list.Where(o => rule(Convert.ToDouble(o))).ToArray(); 
foreach (T item in itemsToRemove) { 
    list.Remove(item); 
} 
+0

お世話になりました!しかし、私は間違いを見つけました。 – Flo