我有一個數字,包含表像這樣的靜態類:從DataTable獲取單個值的最佳方法?
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"];
}
}
有沒有寫數據1或數據2的方法,從單個行給定ID匹配返回一個值的更好的辦法?
更新#1:
我已經創建了一個擴展方法,似乎相當不錯:然後
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.");
}
}
我的數據1方式變爲:
public static int Data1(int id)
{
return ItemTable.FirstValue<int>(id, "Data1");
}
和數據2變爲:
public static double Data2(int id)
{
return ItemTable.FirstValue<double>(id, "Data2");
}
感謝您的所有回覆,但特別感謝Anthony Pegram,他給出了非常好的LINQ & Lambda代碼單行。
至少你應該重構這兩個函數。唯一的區別是Data1和Data2。除此之外,它看起來像我會用一個無類型的數據集。 – 2010-04-14 12:51:40
我同意重構,但這只是一個例子,Data1或Data2可能根據所選的id做不同的事情。我只是認爲可能會有更優雅的選擇單個項目的方式。 – 2010-04-14 13:12:13