2017-03-08 6 views
1

私はリスト上の "Any"メソッドを使用する関数を持っています。このLinq関数をどのようにリファクタリングすることができますか?

List<String> list = Factory.ReturnList(); //Returns a list of all countries in Europe 

私は "(FR)" リスト "(DE)" のような部分文字列が含まれていることを確認する必要があると、...

Assert.Equal(list.Any(item=> item.Contains("(DE)")), true); Assert.Equal(list.Any(item=> item.Contains("(FR)")), true); Assert.Equal(list.Any(item=> item.Contains("(BE)")), true); Assert.Equal(list.Any(item=> item.Contains("(NL)")), true);

今私はとしてそれを書きたいです機能。私は他の人がこのようなコードを使用して見てきました:

Func<IWebElement, bool> condition = item => item.Text == "something"; 
Assert.Equal(list.Any(condition), true); 

私はすでに次を試してみましたが、それは動作しませんでした:

Func<List<String>, bool> condition = list.Any(x => x.Contains(input)); 

ために:

Cannot implicitly convert type 'bool' to 'System.Func<System.Collections.Generic.List<string>, bool>' 

をどのようにすることができます私の例でそれを行いますか?

「入力」あなただけのラムダ式、使用したい場合はfuncは異なるパラメータ

答えて

0

で呼び出すことができるように、パラメータ/変数にする必要がある:あなたが現在起動している

Func<List<String>, bool> condition = (list,input) => list.Any(x => x.Contains(input)); 
+0

「の入力が」パラメータ/変数である必要があります....あなたのソリューションは、あなたの答えに感謝しかし.... –

4

をメソッドをFuncに割り当てようとしていますが、これはすでに呼び出されてboolを返しているので動作しません。

代わりに、2つの入力引数をカプセル化し、目的に合うようにFuncシグネチャを更新します。

Func<List<String>, string, bool> condition = 
    (list, input) => list.Any(x => x.Contains(input)); 

あなたがそのようにのようなあなたのFuncを呼び出すことができます。

Assert.Equal(condition(new List<string>(), ""), true); 

条件が一定であるため、これはあなたの柔軟性と再利用性の最高度を与えるが、パラメータが変更することができます。

+0

おかげで動作しません。私はこれを書いています: 'Func condition = x => x.Contains("(EN) "); Assert.Equal(list.Any(condition)、true); 'しかし、私は"(EN ")を変数のようにしたいのですが、できますか? –

+0

@HappyBirdあなたは大歓迎です!タイマーがアップしたら、私の答えを受け入れるようにマークすると、それは非常に高く評価され、他の人が正しい方向に向かうように指示します。 –

0

これらの文字列を配列に入れるのはどうですか? funcは異なるパラメータで呼び出すことができるよう

string[] countries = { "DE", "FR", "BE", "NL" }; 

result = from item in list 
       where countries.Any(val => item.Contains(val)) 
       select item; 
+0

'input'はパラメータ/変数である必要がありますので、Funcはさまざまなパラメータで呼び出すことができます。 –

関連する問題