Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Converting a Predicate<T> to a Func<T, bool>

Tags:

I have a class with a member Predicate which I would like to use in a Linq expression:

using System.Linq;  class MyClass {      public bool DoAllHaveSomeProperty()     {         return m_instrumentList.All(m_filterExpression);     }      private IEnumerable<Instrument> m_instrumentList;      private Predicate<Instrument> m_filterExpression; } 

As I read that "Predicate<T> is [...] completely equivalent to Func<T, bool>" (see here), I would expect this to work, since All takes in as argument: Func<Instrument, bool> predicate.

However, I get the error:

Argument 2: cannot convert from 'System.Predicate<MyNamespace.Instrument>' to 'System.Type' 

Is there a way to convert the predicate to an argument that this function will swallow?

like image 233
Yellow Avatar asked Aug 27 '14 15:08

Yellow


2 Answers

The two types represent the same logical signature, but that doesn't mean they're just interchangable. A straight assignment won't work, for example - but you can create a new Func<T, bool> from the Predicate<T, bool>. Sample code:

Predicate<string> pred = x => x.Length > 10; // Func<string, bool> func = pred; // Error Func<string, bool> func = new Func<string, bool>(pred); // Okay 

This is a bit like having two enum types with the same values - you can convert between them, but you have to do so explicitly. They're still separate types.

In your case, this means you could write:

public bool DoAllHaveSomeProperty() {     return m_instrumentList.All(new Func<T, bool>(m_filterExpression)); } 

The lambda expression approach suggested by other answers will work too, of course.

like image 60
Jon Skeet Avatar answered Oct 18 '22 20:10

Jon Skeet


public bool DoAllHaveSomeProperty() {     return m_instrumentList.All(i => m_filterExpression(i)); } 
like image 34
George Vovos Avatar answered Oct 18 '22 20:10

George Vovos