Lambda expression of a Linq query in a variable

How can I define the lambda expression that I want to use in a linq query as a variable?

For example, when sorting a general list by various list properties:

 IList<SampleClass> list = new List<SampleClass>();

 // Populate list
 ...

 list.OrderBy(sampleclass => sampleclass.property1);
 list.OrderBy(sampleclass => sampleclass.property2);

I would like to define a lambda expression (sampleclass => sampleclass.property1) in a variable and call:

// ??? define expression in a variable ???
Expression expression = sampleclass => sampleclass.property1;

// Sort list by variable expression
list.OrderBy(expression);

Thanks in advance Tobi

+3
source share
6 answers

You can use one of the overloads Func(for Func<T, TResult>sure):

Func<SampleClass, PropertyType> expr = sampleclass => sampleclass.property1;
list.OrderBy(expr);

PropertyType- type of variable saved as property1in yours SampleClass. If it were, for example string, you would use Func<SampleClass, string>.

+4
source

Define Func<TSampleClass, TPropertyType>as follows:

  List<SampleClass> list = new List<SampleClass>();   
  Func<SampleClass, int> expr = (c) => c.SomeProperty;
  _HungerLevel = level;


  class SampleClass
  {
    public int SomeProperty { get; set; }
  }
+2
source

:

Func<SampleClass, int> f = sampleClass => sampleClass.Property1;
list.OrderBy(f);

, Property1 int.

+1

.

- , (, ). - - .

:

list.OrderBy(sampleclass => sampleclass.property1);

Func<SampleClass,string> getKey = sampleclass => sampleclass.property1;
list.OrderBy(getKey);

string GetKey(SampleClass sampleclass)
{
    return sampleclass.property1;
}

list.OrderBy(GetKey);

( , property1 , , , !)

+1

, Func<T, TResult> .

- , Linq-To-Objects, . - Expression<Func<T, TResult>>.

0

LINQ , Expression, Enumerable.OrderBy Func:

var list = new List<SampleClass> ();

Func<SampleClass, PropertyType1) orderSelector1 = (obj => obj.Property1); // parentheses for clarity
var sequence1 = list.OrderBy (orderSelector1);

Func<SampleClass, PropertyType2) orderSelector1 = (obj => obj.Property2);
var sequence2 = list.OrderBy (orderSelector2);

If you want to assign multiple times, you can do Funcreturn object:

var list = new List<SampleClass> ();
Func<SampleClass, object> orderSelector;

orderSelector = (obj => obj.Property1);
var sequence1 = list.OrderBy (orderSelector);

orderSelector = (obj => obj.Property2);
var sequence2 = list.OrderBy (orderSelector);

If you really need a dynamic property selection , i.e. a call OrderBywith the property given string, you will need Expressions. There are many examples in this thread that allow you to do something like:

var list = new List<SampleClass> ();
var sequence1 = list.OrderBy ("Property1");
var sequence2 = list.OrderBy ("Property2");
0
source

All Articles