c# - anonyme - Verwendung von Lambda-Ausdrücken für eine Funktion, die eine Delegatenliste verwendet



c# lambda action (2)

Anstatt eine List<Func<T, string>> benutze ein Func<T, string>[] und mache es zu einem Parameter-Array :

static string OutputCSVString<T>(this IList<T> list,
                                 params Func<T, string>[] properties)

Dann sollten Sie in der Lage sein anzurufen:

string s = Products.OutputCSVString(p => p.Id , p => p.Name);

Beachten Sie, dass Sie ab C # 6 schreiben können:

static string OutputCSVString<T>(this IList<T> list,
                                 params IEnumerable<Func<T, string>> properties)

... was bedeuten würde, dass Sie es immer noch mit einer List<Func<T, string>> könnten.

Ich erstelle eine Erweiterungsmethode für IList, um die angegebenen Eigenschaften aller Objekte, die als Liste übergeben werden, auszugeben und als CSV-Zeichenfolge auszugeben. Es sieht aus wie:

public static string OutputCSVString<T>(this IList<T> list, List<Func<T, string>> properties)
{
   foreach (var row in list)
   {
     foreach(var item in properties)
     { 
        // Do the output work, including calling item(row).
     }
      // Output new line
   }
 }

Im Moment muss ich diese Methode wie folgt nennen:

// Assuming I've populated List <Product> ProductList up above...

var columns = new List<Func<Product, string>>();
columns.Add(x => x.Id);
columns.Add(x => x.Name);

string s = ProductList.OutputCSVString(columns);

Gibt es eine bessere Möglichkeit, meine Lambda-Ausdrücke zu übergeben, ohne die Spaltenvariable explizit deklarieren zu müssen?

// This doesn't compile
string s = Products.OutputCSVString(new { p => p.Id , p => p.Name });

Sie könnten Ihre Lambdas als Array übergeben und das Schlüsselwort params :

public static string OutputCSVString<T>(this IList<T> list, params Func<T, string>[] properties)

Verwendung:

string s = Products.OutputCSVString(p => p.Id, p => p.Name);




delegates