从 .NET 2.0 中的 DataTable 的列中获取不同的值
Get distinct values from a column of DataTable in .NET 2.0
我正在处理一个使用 .NET Framework 2.0 开发的遗留项目。
在这个项目中,我通过 ItemNo
列从 DataRowCollection
中获得不同的值。我只对 ItemNo
感兴趣。 DataRow
由ItemNo
、Qty
和Date
组成。
我正在考虑迭代 DataRowCollection
并将唯一的 ItemNo
添加到如下字符串列表中(未测试)
var items = new List<string>();
foreach (DataRow orderItem in rows)
{
var itemNo = orderItem["ITEMNO"].ToString().Trim();
if(items.Find(delegate(string str) { return str == itemNo ;}) == null)
{
items.Add(itemNo);
}
}
有没有不用 LINQ 的更好方法(.Net Framework 2.0 不喜欢 LINQ)
要从列中获取不同的值,您可以使用此方法:
List<T> SelectDistict<T>(DataTable table, string column)
{
DataTable temp = new DataView(table).ToTable(true, column);
List<T> items = new List<T>();
foreach (DataRow row in temp.Rows)
items.Add(row.Field<T>(column));
return items;
}
在上面的方法中,我使用了 DataView.ToTable
,通过将 true
作为第一个参数传递,选择了不同的值。
这是用法示例:
List<string> items = SelectDistict<string>(yourDataTable, "ITEMNO");
备注
如果您需要 trim 值,您可以更改上面的代码并首先创建 DataTable
的克隆副本。然后通过将 TRIM(column)
分配给列的 Expression
属性,添加一个计算列,其中包含来自给定列名称的 trimmed 值的不同值。然后按照上面代码中使用新的 trimmed 列的步骤进行操作。
// Given a data table:
var dt = new DataTable();
dt.Columns.Add("ITEMNO");
dt.Rows.Add("1 ");
dt.Rows.Add(" 1");
dt.Rows.Add("2");
var dict = new Dictionary<string, bool>();
foreach(DataRow dr in dt.Rows)
{
var itemNo = dr["ITEMNO"].ToString().Trim();
// Take advantage of O(1) lookup:
if (!dict.ContainsKey(itemNo))
{
dict.Add(itemNo, true);
}
}
// Get list from dictionary keys:
var items = new List<string>(dict.Keys);
如果您可以在服务器上安装 .Net 3.5,并在您的应用程序中引用 System.Core.dll,您可以利用 HashSets 将上面的代码修改为:
var hashSet = new HashSet<string>();
foreach(DataRow dr in dt.Rows)
{
var itemNo = dr["ITEMNO"].ToString().Trim();
// Only unique elements are added to the hash set,
// no need to check for duplicates
hashSet.Add(itemNo);
}
var items = new List<string>(hashSet);
公认使用 HashSet 而不是字典的好处是微不足道的,但我更喜欢它,因为我不关心字典中的任意 bool 值,但你需要满足 .Net 3.5 和参考资料。
我正在处理一个使用 .NET Framework 2.0 开发的遗留项目。
在这个项目中,我通过 ItemNo
列从 DataRowCollection
中获得不同的值。我只对 ItemNo
感兴趣。 DataRow
由ItemNo
、Qty
和Date
组成。
我正在考虑迭代 DataRowCollection
并将唯一的 ItemNo
添加到如下字符串列表中(未测试)
var items = new List<string>();
foreach (DataRow orderItem in rows)
{
var itemNo = orderItem["ITEMNO"].ToString().Trim();
if(items.Find(delegate(string str) { return str == itemNo ;}) == null)
{
items.Add(itemNo);
}
}
有没有不用 LINQ 的更好方法(.Net Framework 2.0 不喜欢 LINQ)
要从列中获取不同的值,您可以使用此方法:
List<T> SelectDistict<T>(DataTable table, string column)
{
DataTable temp = new DataView(table).ToTable(true, column);
List<T> items = new List<T>();
foreach (DataRow row in temp.Rows)
items.Add(row.Field<T>(column));
return items;
}
在上面的方法中,我使用了 DataView.ToTable
,通过将 true
作为第一个参数传递,选择了不同的值。
这是用法示例:
List<string> items = SelectDistict<string>(yourDataTable, "ITEMNO");
备注
如果您需要 trim 值,您可以更改上面的代码并首先创建 DataTable
的克隆副本。然后通过将 TRIM(column)
分配给列的 Expression
属性,添加一个计算列,其中包含来自给定列名称的 trimmed 值的不同值。然后按照上面代码中使用新的 trimmed 列的步骤进行操作。
// Given a data table:
var dt = new DataTable();
dt.Columns.Add("ITEMNO");
dt.Rows.Add("1 ");
dt.Rows.Add(" 1");
dt.Rows.Add("2");
var dict = new Dictionary<string, bool>();
foreach(DataRow dr in dt.Rows)
{
var itemNo = dr["ITEMNO"].ToString().Trim();
// Take advantage of O(1) lookup:
if (!dict.ContainsKey(itemNo))
{
dict.Add(itemNo, true);
}
}
// Get list from dictionary keys:
var items = new List<string>(dict.Keys);
如果您可以在服务器上安装 .Net 3.5,并在您的应用程序中引用 System.Core.dll,您可以利用 HashSets 将上面的代码修改为:
var hashSet = new HashSet<string>();
foreach(DataRow dr in dt.Rows)
{
var itemNo = dr["ITEMNO"].ToString().Trim();
// Only unique elements are added to the hash set,
// no need to check for duplicates
hashSet.Add(itemNo);
}
var items = new List<string>(hashSet);
公认使用 HashSet 而不是字典的好处是微不足道的,但我更喜欢它,因为我不关心字典中的任意 bool 值,但你需要满足 .Net 3.5 和参考资料。