2009-01-23 7 views
3

J'ai du code qui accepte un DataTable comme un paramètre et calcule le total de plusieurs des colonnes dans le DataTable. Je pensais que ce serait bien de pouvoir passer une expression lambda qui ferait un filtre sur la colonne que je totalisais.Comment puis-je passer un lambda qui servira de filtre pour une ligne dans une datatable?

est ici une partie du code:

public TrafficTotals CalculateTotals(DataTable table) 
{ 
    TrafficTotals total = new TrafficTotals(); 
    total.TotalTraffic = table.AsEnumerable().Sum(p => p.Field<int>("Converted")); 
    // More stuff 

Je peux ajouter manuellement un filtre dans l'expression directement dans le code:

var filteredTotal = table.AsEnumerable().Where(p => p.Field<string>("MyColumn") == "Hello").Sum(p => p.Field<int>("Converted")); 

Mais au lieu que j'aimerais passer le « Où "portion comme expression lambda à la place, mais je continue à me perdre dans la syntaxe pour obtenir les paramètres corrects.

J'ai plusieurs façons de contourner cela qui n'impliquent pas vraiment lambdas mais cela semble être une bonne façon de gérer cela.

Des idées?

Répondre

7

Je suis un peu confus parce que vous êtes déjà spécifiant la clause Where avec une expression lambda, mais je suppose que vous voulez ceci:

public TrafficTotals CalculateTotals(DataTable table, 
            Func<DataRow, bool> filter) 
{ 
    TrafficTotals total = new TrafficTotals(); 
    total.TotalTraffic = table.AsEnumerable() 
           .Where(filter) 
           .Sum(p => p.Field<int>("Converted")); 
    // More stuff 
} 

Vous souhaitez alors appelez avec:

totals = CalculateTotals(table, 
         row => row.Field<string>("MyColumn") == "Hello"); 

C'est ce que vous recherchez?

+0

Le code se lit comme le premier exemple. Le deuxième exemple est comment je voulais qu'il se comporte (pas comment le code a été réellement écrit). Dang, j'étais si proche. Je n'étais pas sûr du type de Func qu'il voulait, mais maintenant que je le vois, c'est assez évident. –

0

Si vous souhaitez stocker l'expression lambda, vous devez le déclarer comme tel. Cela retourne vrai si un entier est inférieur à 3 par exemple:

Func<int,bool> F = o=>o < 3 

Ensuite, vous pouvez passer autour.

Questions connexes