2012-04-13 8 views
2

Wie kann ich einen Lambda-Ausdruck als Parameter in dieser Methode verwenden und in der Where-Klausel verwenden?Wie führe ich eine Dynamik, wo Lambda auf T in C# 4?

Lesen über Func, dynamische und Expression-Bäume, aber nicht sicher, wie dies zu tun ist.

Problem ist, dass ich den Typ T nicht kenne und nicht weiß, was der Anrufer zurückgeben will. Wie kann ich das in C# 4.0 tun? Ein Beispiel, um mich zu starten, wäre großartig - danke.

Hier ist ein stark vereinfachtes Beispiel was ich will.

static public List<T> Match(string startfilelocation, ???) 
{ 
    var filelist = Directory.GetFiles(startfilelocation, "*.*", SearchOption.AllDirectories); 
    return filelist.Where(???); 
} 

Vielen Dank.

Antwort

1

Geben List<string> als Rückgabetyp zwei überladene Methoden haben, verwenden Sie den Func<string, bool> Typ für den Parameter, dann die ToList Methode das Ergebnis in eine Liste zu machen:

static public List<string> Match(string startfilelocation, Func<string, bool> filter) { 
    var filelist = Directory.GetFiles(startfilelocation, "*.*", SearchOption.AllDirectories); 
    return filelist.Where(filter).ToList(); 
} 

Beispiel:

List<string> files = Match(folder, s => s.Contains("candy")); 
1
static public IEnumerable<string> Match(string startfilelocation,Func<string,bool> selector) 
{ 
    var filelist = Directory.GetFiles(startfilelocation, ".", SearchOption.AllDirectories); 
    return filelist.Where(selector); 
} 

Ich würde auch Directory.EnumerateFiles statt empfehlen GetFiles verwenden nicht alle Dateinamen in den Speicher in LINQ

0

Die Where-Methode zum Laden nur zwei Parameter Func<TSource,bool> und Func<TSource,int,bool> annehmen kann. In Ihrem Fall, wo filelist ist ein string[] daher können Sie

static public IEnumerable<string> Match(string startfilelocation, Func<string,bool> predicate) 
{ 
    var filelist = Directory.GetFiles(startfilelocation, "*.*", SearchOption.AllDirectories); 
    return filelist.Where(predicate); 
} 



static public IEnumerable<string> Match(string startfilelocation, Func<string,int,bool> predicate) 
{ 
    var filelist = Directory.GetFiles(startfilelocation, "*.*", SearchOption.AllDirectories); 
    return filelist.Where(predicate); 
}