2011-05-25 79 views
3

如何定義我想在linq查詢中使用的lambda表達式作爲變量?在變量中使用Linq查詢的lambda表達式

例如排序由listItems中的不同屬性的通用列表時:

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

// Populate list 
... 

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

我想在一個變量來定義lambda表達式(sampleclass => sampleclass.property1)和呼叫:

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

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

在此先感謝 託比

回答

4

您可以使用Func重載一個(Func<T, TResult>精確):

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

PropertyType存儲爲property1SampleClass變量的類型。例如,如果它是string,則可以使用Func<SampleClass, string>

1

您可以使用:

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

這假設Property1的類型爲int。

+0

糟糕,太慢了。 – aligray 2011-05-25 07:24:47

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; } 
    } 
+0

這不起作用: 「不能將lambda表達式分配給隱含型局部變量」 – Tobias 2011-05-25 07:44:40

+1

它適用於我的機器。 – Shimmy 2011-05-25 11:26:15

+1

@Tobias你在聲明Func時使用了var關鍵字嗎? – aligray 2011-05-25 21:26:57

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是一個字符串,但它當然不是要求!)

0

就像其他人說的那樣,您可以使用Func<T, TResult>將代理存儲到您的函數中。

如果你想使用Linq-To-Objects以外的東西,那麼你應該把它包含在Expression中。像Expression<Func<T, TResult>>

0

如果您對LINQ純粹的交談對象,沒有必要爲Expression這兒,因爲參數Enumerable.OrderByFunc代表:

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); 

如果你真的想動態屬性選擇,即打電話OrderBystring指定的財產,您需要Expression s。 this thread中有很多示例,它們允許您執行類似操作:

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