Question

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 ). Existe-t-il un moyen de rendre DataTable énumérable sans utiliser Select ()?

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

Mise à jour:

Je voulais que ça ressemble à ceci:

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

Je devine que la méthode Select de DataTable renvoie une copie, je pense simplement utiliser AsEnumerable, le problème est que je ne fais que cibler 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 présente des erreurs de compilation.

Était-ce utile?

La solution

    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);

Autres conseils

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

Garder votre énumérateur strictement 2.0:

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

Ensuite, appelez avec linqbridge comme ceci:

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

Vous pouvez essayer de transtyper le DataTable en tant que IEnumerable et effectuer une itération 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 va parcourir la liste et rechercher le nom du fichier (je suppose que vous recherchez le premier DataRow avec ce nom, pas toutes les lignes qui correspondent à ce nom).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top