Лямбда-выражение Linq-запроса в переменной - PullRequest
3 голосов
/ 25 мая 2011

Как определить лямбда-выражение, которое я хочу использовать в запросе linq, в качестве переменной?

Например, при сортировке общего списка по различным свойствам элементов списка:

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

 // Populate list
 ...

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

Я хотел бы определить лямбда-выражение (sampleclass => sampleclass.property1) в переменной и вызвать:

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

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

Заранее спасибо Тоби

Ответы [ 6 ]

5 голосов
/ 25 мая 2011

Вы можете использовать одну из Func перегрузок (точно * Func<T, TResult>):

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

PropertyType - это тип переменной, хранящейся как property1 в вашем SampleClass.Если бы это был например string, вы бы использовали Func<SampleClass, string>.

2 голосов
/ 25 мая 2011

Определите Func<TSampleClass, TPropertyType> следующим образом:

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


  class SampleClass
  {
    public int SomeProperty { get; set; }
  }
1 голос
/ 25 мая 2011

Вы уже почти сделали это.

Параметр - это любая функция, берущая элемент из последовательности и дающая в результате его ключ (ключ, по которому будет выполнено упорядочение).Лямбда-выражение - это всего лишь разновидность такой функции.

Возможны следующие обозначения:

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 голос
/ 25 мая 2011

Вы можете использовать:

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

Это предполагает, что тип Property1 имеет тип int.

0 голосов
/ 25 мая 2011

Если вы говорите исключительно о LINQ to Objects, здесь нет необходимости в Expression s, поскольку аргументом 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);

Если вы хотите назначитьнесколько раз вы можете сделать Func return 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);

Если вы действительно хотите динамический выбор свойства, то есть вызов OrderBy со свойством, указанным string вам понадобится Expression с.В этой теме есть множество примеров, которые позволяют вам сделать что-то вроде:

var list = new List<SampleClass> ();
var sequence1 = list.OrderBy ("Property1");
var sequence2 = list.OrderBy ("Property2");
0 голосов
/ 25 мая 2011

Точно так же, как говорили другие люди, вы можете использовать Func<T, TResult> для хранения делегата в вашей функции.

Если вы хотите использовать что-то другое, кроме Linq-To-Objects, то вы должны также включить это в выражение,Что-то вроде Expression<Func<T, TResult>>.

...