Meilleure façon d'obtenir une valeur unique à partir d'un DataTable?

J'ai un certain nombre de classes statiques contiennent des tables comme ceci:

using System;
using System.Data;
using System.Globalization;
public static class TableFoo
{
private static readonly DataTable ItemTable;
static TableFoo()
{
ItemTable = new DataTable("TableFoo") { Locale = CultureInfo.InvariantCulture };
ItemTable.Columns.Add("Id", typeof(int));
ItemTable.Columns["Id"].Unique = true;
ItemTable.Columns.Add("Description", typeof(string));
ItemTable.Columns.Add("Data1", typeof(int));
ItemTable.Columns.Add("Data2", typeof(double));
ItemTable.Rows.Add(0, "Item 1", 1, 1.0);
ItemTable.Rows.Add(1, "Item 2", 1, 1.0);
ItemTable.Rows.Add(2, "Item 3", 2, 0.75);
ItemTable.Rows.Add(3, "Item 4", 4, 0.25);
ItemTable.Rows.Add(4, "Item 5", 1, 1.0);
}
public static DataTable GetItemTable()
{
return ItemTable;
}
public static int Data1(int id)
{
DataRow[] dr = ItemTable.Select("Id = " + id);
if (dr.Length == 0)
{
throw new ArgumentOutOfRangeException("id", "Out of range.");
}
return (int)dr[0]["Data1"];
}
public static double Data2(int id)
{
DataRow[] dr = ItemTable.Select("Id = " + id);
if (dr.Length == 0)
{
throw new ArgumentOutOfRangeException("id", "Out of range.");
}
return (double)dr[0]["Data2"];
}
}

Est-il une meilleure façon d'écrire les Données 1 ou 2 méthodes qui retournent une valeur unique à partir d'une seule ligne qui correspond à l'id donné?

Mise à jour #1:

J'ai créé une méthode d'extension qui semble tout à fait agréable:

public static T FirstValue<T>(this DataTable datatable, int id, string fieldName)
{
try
{
return datatable.Rows.OfType<DataRow>().Where(row => (int)row["Id"] == id).Select(row => (T)row[fieldName]).First();
}
catch
{
throw new ArgumentOutOfRangeException("id", "Out of range.");
}
}

Mon Data1 méthode devient alors:

public static int Data1(int id)
{
return ItemTable.FirstValue<int>(id, "Data1");
}

et Data2 devient:

public static double Data2(int id)
{
return ItemTable.FirstValue<double>(id, "Data2");
}

Merci à tous de vos réponses, mais surtout à Anthony Pegram qui a donné à la très belle ligne de LINQ & Lambda code.

au moins, vous devriez refactoriser ces deux fonctions. La seule différence est la Données1 et Données2. Autre que cela ressemble à ce que je ferais avec un dataset non.
Je suis d'accord avec refactoring, mais ce était juste un exemple et Data1 ou Data2 peut faire des choses différentes en fonction de l'id sélectionné. Je pensais simplement qu'il peut y avoir une façon plus élégante de la sélection d'un seul élément.

OriginalL'auteur Piers Myers | 2010-04-14