2009-06-25 9 views
4

Je ne peux pas utiliser AsEnumerable() sur DataTable, j'utilise C# 3 mais je ne fais que cibler le framework 2.0 (la fonctionnalité LINQ est une gracieuseté de LINQBridge). Est-il possible de rendre DataTable enumerable sans utiliser Select()?Comment est-ce que je peux énumérer DataTable?

bool isExisting = (bdsAttachments.DataSource as DataTable).Select().Any(xxx => (string)dr["filename"] == filename); 

Mise à jour:

je le voulais pour le faire ressembler à ceci:

bool isExisting = (bdsAttachments.DataSource as DataTable).AsEnumerable().Any(xxx => (string)dr["filename"] == filename); 

Je reçois une petite idée que la méthode Select de DataTable retourne une copie, je pense pour utiliser simplement AsEnumerable, le problème est que je ne cible que le framework 2.0, System.Data.DataSetExtensions n'est pas disponible

BTW, j'ai essayé ceci: http://cs.rthand.com/blogs/blog_with_righthand/archive/2006/01/15/284.aspx, mais a compila erreurs de

Répondre

11
public static IEnumerable<DataRow> EnumerateRows(this DataTable table) 
    { 
     foreach (var row in table.Rows) 
     { 
      yield return row; 
     } 
    } 

vous permet d'appeler:

bool isExisting = (bdsAttachments.DataSource as DataTable).EnumerateRows().Any(dr => (string)dr["filename"] == filename); 
+0

votre réponse me force à creuser dipper sur IEnumerable^_^je l'ai googlé, je l'ai trouvé http://www.developerfusion.com/article/9397/iterator-blocks-in-c-2-autogenerated-state-machines/ vraiment éclairant – Hao

1

Vous pouvez jeter DataTable comme IEnumerable et itérer sur l'ensemble:

//your data exists as a DataTable 
DataTable dt = (DataTable)bdsAttachments.DataSource; 
foreach (DataRow row in dt) 
{ 
    if (row["filename"] == filename) 
     return row; 
} 

Le foreach itérera la liste et la recherche du nom de fichier (je suppose que vous êtes à la recherche pour la première DataRow avec cette nom de fichier, pas toutes les lignes qui correspondent au nom de fichier).

+0

IListSource.GetList() ne correspondent pas à une méthode d'extension de LINQ. Les méthodes de LINQ ne sont disponibles que sur les énumérables. – Hao

+0

Je pensais que l'idée était de ne PAS utiliser LINQ (d'où l'exigence .NET Framework 2.0). –

2

Garder votre recenseur strictement 2.0:

public static IEnumerable<DataRow> getRows(DataTable table) 
{ 
    foreach (DataRow row in table.Rows) 
    { 
     yield return row; 
    } 
} 

appellent ensuite avec linqbridge comme ceci:

bool isExisting = getRows(bdsAttachments.DataSource as DataTable).Any(row => (string)row["filename"] == filename); 
+0

Sélectionner n'est pas disponible sur .Rows, que ce soit à partir du framework 2.0 ou du framework – Hao

+0

oui, vous m'avez capturé entre les modifications. –

4
  1. IEnumerable<DataRow> rows = dataTable.AsEnumerable(); (System.Data.DataSetExtensions.dll)
  2. IEnumerable<DataRow> rows = dataTable.Rows.OfType<DataRow>(); (System.Core.dll)
Questions connexes