2010-12-13 33 views
2

Désolé, je prends juste LINQ et je suis relativement nouveau à ce sujet. Est-il possible de convertir ce qui suit en LINQ?Convertir ce code en LINQ?

Est-il possible de convertir ce qui suit en LINQ?

foreach (DataRow row in results.Rows) 
    { 
     if (row["REMARKS"].ToString() == "Passes" || row["REMARKS"].ToString() == "Promoted") 
     { 
      result = String.Concat(result,row["ROLL_NO"].ToString()," "); 
     } 
    } 
+0

Merci les gars .. qui vous a été vraiment rapide ppl .. –

Répondre

5

Nous ne savons pas ce que la valeur initiale de result est ce qui rend cette délicate, mais en supposant que vous en fait je veux juste une liste séparée par des espaces, je ferais ceci:

var query = from DataRow row in result.Rows 
      let remarks = row["REMARKS"].ToString() 
      where remarks == "Passes" || remarks == "Promoted" 
      select row["ROLL_NO"].ToString(); 

string results = string.Join(" ", query); 

(Notez que DataTable n'implémente pas IEnumerable<DataRow>, ce qui est la raison pour laquelle je l'ai utilisé une variable de portée explicitement typé. une alternative serait d'appeler result.Rows.AsEnumerable() et faire row est implicitement typé.)

La ligne finale suppose .NET 4, qui a plus de surcharges pour string.Join que les versions antérieures. Dans le cas contraire, cela le ferait:

string results = string.Join(" ", query.ToArray()); 

Bien sûr, si vous utilisez LINQ alors vous pouvez bien vouloir se éloigner de DataTable etc pour commencer et utiliser LINQ to SQL, Entity Framework, NHibernate ou tout les autres options disponibles :)

+0

+1: Dieu utilise 'let' pour ranger la requête. –

+0

oui ... c'est le plus simple à lire, c'est pourquoi je voulais passer à linq en premier lieu. Merci Jon! BTW que voulez-vous dire en s'éloignant de Datatable etc? –

+0

Je suppose qu'il veut dire passer à LINQ to SQL au lieu d'utiliser un DataTable pour récupérer les données, et LINQ pour le traiter ensuite. Pure LINQ to SQL rendra cette chose encore plus lisible et vous permettra d'émettre le code pour extraire les données dans le datatable. –

2
results.Rows 
     .Cast<DataRow>() // If you need this line or not depends on the type of result.Rows 
     .Where(row => row["REMARKS"].ToString() == "Passes" || 
        row["REMARKS"].ToString() == "Promoted") 
     .Aggregate(result, (acc, row) => String.Concat(acc, row["ROLL_NO"].ToString()," ")) 
+0

J'aime mieux que ma réponse, il est un pur mise en œuvre de LINQ – Rony

1
result = results.Rows.Cast<DataRow>().Where(row => row["REMARKS"].ToString() == "Passes" || row["REMARKS"].ToString() == "Promoted").Aggregate(result, (current, row) => String.Concat(current, row["ROLL_NO"].ToString(), " ")); 
+0

1 - cos cela fonctionne, mais je j'aime vraiment jons répondre pour sa simplicité et sa lisibilité! –

+0

Merci pour le +1. Je suis d'accord, Jon est très lisible en effet. – jvanrhyn

0
string.Join(" ", result.Rows.Cast<DataRow>().Where(r => r["REMARKS"].ToString() == "Passes" || r["REMARKS"].ToString() == "Promoted").Select(r => r["ROLL_NO"].ToString()).ToArray()); 
+0

Ceci ne compilera pas - vous avez besoin d'un appel à 'Cast ' ou utilisez 'Rows.AsEnumerable()' - car 'DataTable' n'implémente pas' IEnumerable '. –

+0

oui c'est vrai – Rony