如何定义我想在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);
提前致谢 托比
答案 0 :(得分:4)
您可以使用Func
重载之一(Func<T, TResult>
精确地):
Func<SampleClass, PropertyType> expr = sampleclass => sampleclass.property1;
list.OrderBy(expr);
PropertyType
是property1
中存储为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");