Linq查询在变量中的Lambda表达式

时间:2011-05-25 07:14:34

标签: c# linq sorting lambda expression

如何定义我想在linq查询中用作变量的lambdaexpression?

例如,当按照列表项的不同属性对通用列表进行排序时:

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

 // Populate list
 ...

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

我想在变量中定义lambda表达式(sampleclass =&gt; sampleclass.property1)并调用:

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

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

提前致谢 托比

6 个答案:

答案 0 :(得分:4)

您可以使用Func重载之一(Func<T, TResult>精确地):

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

PropertyTypeproperty1中存储为SampleClass的变量类型。如果是string,则使用Func<SampleClass, string>

答案 1 :(得分:2)

按如下方式定义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; }
  }

答案 2 :(得分:1)

您可以使用:

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

这假设Property1的类型是int。

答案 3 :(得分:1)

你几乎已经完成了它。

该参数是从序列中获取项目并作为结果给出其键的任何函数(将在其上进行排序的键)。 lambda表达式只是各种这样的函数。

这些符号是可能的:

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是一个字符串,但它当然不是必需的!)

答案 4 :(得分:0)

就像其他人说的那样,您可以使用Func<T, TResult>将代理存储到您的函数中。

如果你想使用除Linq-To-Objects之外的其他东西,那么你也应该将它包含在Expression中。类似于Expression<Func<T, TResult>>

答案 5 :(得分:0)

如果你纯粹是在谈论LINQ to Objects,那么这里不需要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);

如果您想多次分配,可以Func返回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 s。 this thread中有很多例子可以让你做类似的事情:

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