2010-03-29 20 views
5

Lambda ifadeleri hakkındaki bilgim biraz titrek, Lambda ifadeleri (LINQ) kullanan bir kod yazabilirim. Lambda Expression türünde birkaç argüman alır.Lambda İfadeleri İşlem İçine Bağımsız Değişken Olarak Nasıl İşlenir - C# .NET 3.5

Arka plan: Ben tam anlamıyla başka bir nesne türünden TreeItem türünde nesnelerin bir Ağaç Koleksiyonu döndüren bir yöntem yazmaya çalışıyorum. Şimdiye kadar aşağıdaki adres: sadece aracılığıyla çağrılabilir

public class TreeItem 
{ 
    public string Id { get; set; } 
    public string Text { get; set; } 

    public TreeItem Parent { get; protected set; } 

    public IList<TreeItem> Children 
    { 
     get 
     { 
      // Implementation that returns custom TreeItemCollection type 
     } 
    } 

    public static IList<TreeItem> GetTreeFromObject<T>(IList<T> items, 
     Expression<Func<T, string>> id, 
     Expression<Func<T, string>> text, 
     Expression<Func<T, IList<T>>> childProperty) where T : class 
    { 
     foreach (T item in items) 
     { 
      // Errrm!?? What do I do now? 
     } 

     return null; 
    } 
} 

... ...

IList<TreeItem> treeItems = TreeItem.GetTreeFromObject<Category>(
    categories, c => c.Id, c => c.Name, c => c.ChildCategories); 

Ben dize değerlerle İfadeler yerini alabilir ve yansıma kullanın, ancak ben Bunu şiddetle yazarak yapmak istediğimden kaçınmaya çalışıyorum.

Bunu yapmamın nedenleri, TreeItem türünü kabul eden bir denetimim var, oysa ağaç yapısında tüm düzinelerce farklı türde yapıyorum ve ayrı dönüştürme yöntemleri yazmak istemiyorum. her tür (DRY ilkesine bağlı kalmaya çalışmak).

Bunu doğru şekilde mi yapıyorum? Bunu yapmanın daha iyi bir yolu var mı?

cevap

7

"Lambda ifadesi" türü yok. Bir lambda ifadesi, uyumlu bir temsilci türüne veya bir expression tree'a dönüştürülebilir.

Varolan yöntem imzanız ifade ağaçlarını kullanır - ancak gerçekten gerekmediği net değil. (Birkaç parametre adı değişikliklerle) temsilci formunu deneyin:

public static IList<TreeItem> GetTreeFromObject<T>(IList<T> items, 
    Func<T, string> idSelector, 
    Func<T, string> textSelector, 
    Func<T, IList<T>> childPropertySelector) where T : class 

Sonra böyle bir şey yapabilirsiniz:

foreach (T item in items) 
{ 
    string id = idSelector(item); 
    string text = textSelector(item); 
    IList<T> children = childPropertySelector(item); 
    // Do whatever you need here 
} 
+0

parlak bu! Neyin peşindeyim, çok teşekkür ederim! İfadelerin aşağıdaki gibi delegelere dönüştürülebileceğini unutmayın: Func > childFunc = childProperty.Compile(); ama ihtiyacın olmadığını söylediğin gibi, sadece Funcdelegesi tipine geç, şerefe! –

İlgili konular