2010-08-04 76 views
2

據我所知,謂詞委託的函數會返回布爾並採取泛型參數,我明白,當我說:謂詞和排序依據,Func鍵

mycustomer => mycustomer.fullname == 1 

它實際上意味着:

delegate (Customer mycustomer) 
{ 
    return mycustomer.fullName == "John"; 
} 

的當我通過這個lambda表達式時,我傳入的參數是:

public delegate bool Criteria<T>(T value)這本來就叫做謂詞

但我不明白的是什麼意思,當我說mycustomer=>mycustomer.fullname

customers.OrderBy(mycustomer=>mycustomer.fullname);

如何實現類似OrderBy?我如何告訴一個方法哪個屬性可以執行操作!像前面的例子一樣?

例如這裏是我想要得到哪一個集合的所有值特定屬性的方法的情況:

list<string> mylist = customers.GetPropertyValues(cus=>cus.Fullname); 

在此先感謝。

+0

'Predicate'是一個返回'bool'的函數。 'mycustomer => mycustomer.fullname'是'Func '(我猜'fullname'是'string'類型的)。你應該閱讀關於迭代器(IEnumerable,yield,...)。如果你正在使用數據庫等 - 這都是關於表達式樹的。 – 2010-08-04 08:42:14

回答

2

Func<TElement,TKey>用於創建IComparer<TKey>,該值在OrderedEnumerable內部用於對項目進行排序。當你這樣做:

var items = myList.OrderBy(i => i.SomeProperty); 

OrderedEnumerable類型在內部創建一個IComparer<TKey>。在上面的例子中,如果i.SomePropertyString,它將創建一個IComparer<String>的實例,然後使用該編譯器在SomeProperty成員上對源枚舉中的項進行排序。

在你最後一種情況:

list<string> mylist = customers.GetPropertyValues(cus=>cus.Fullname); 

你做到這一點使用Select

var names = customers.Select(c => c.Fullname); 

它會返回一個枚舉的String名。在Select方法中,Func<TSource, TResult>用於選擇要添加到結果中的目標元素。

要複製這個你自己,你可以這樣做:

public static IEnumerable<TMember> GetPropertyValues<TSource, TMember> 
    (this IEnumerable<TSource> enumerable, Func<TSource, TMember> selector) 
{ 
    if (enumerable == null) 
    throw new ArgumentNullException("enumerable"); 

    foreach (TSource item in enumerable) 
    { 
    yield return selector(item); 
    } 
} 
+0

非常感謝您的回覆,但我知道我可以使用customers.select(c => c.fullname)我只是想知道如何實現類似這樣的內容,而不是實際尋找獲取屬性的值,我只是給一個例子,問題是如何實現像customers.GetPropertyValues(cus => cus.Fullname);或客戶。選擇(c => c.Fullname);任何可以使用lambda表達式指定屬性名稱的方法。 – Stacker 2010-08-04 08:37:04

+0

已更新的答案。 – 2010-08-04 08:49:04

3

您可以創建這樣的事情:

static class ExtenstinonClass 
{ 
    static IEnumerable<V> GetPropertyValues<T, V>(this IList<T> collection, Func<T, V> func) 
    { 
     foreach(var item in collection) 
     { 
      yield retun func(item); 
     } 
    } 
} 

但我真的不明白,爲什麼選擇方法不適合你。

+0

即時通訊不反對選擇方法,事情是它不回答這個問題,但你的答案呢!我接受你的答案非常感謝你,非常好 – Stacker 2010-08-04 08:48:35

2

Enumerable上的OrderBy Extension Method採用類型Func作爲參數的方法。 Here是文檔。

Here是另一篇不錯的文章,您可以使用。

+0

不錯的帖子Decy,這個答案真的很不錯,表達樹是什麼IM尋找,謝謝... – Stacker 2010-08-04 08:52:05

2

但我不明白是什麼意思,當我說mycustomer => mycustomer.fullname

這是同樣的事情,你的代表例子,除了它只返回的全名。作爲lambda傳遞,以便可以進行懶惰評估。

如果你想創建一個像OrderBy一樣的方法,除了你的GetPropertyValues看起來與customers.Select(c => c.Fullname)相同,那麼你將不得不深入泛型和擴展方法的海洋。 OrderBy定義實際上只是IEnumerable擴展方法

public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
    this IEnumerable<TSource> source, 
    Func<TSource, TKey> keySelector 
) 

它看起來像從@Mike答案就是一個很好的例子,也LINQ Select的重新實現。

+0

我也接受了,謝謝 – Stacker 2010-08-04 09:38:10