我正在开发一个使用.NET Framework 2.0开发的遗留项目。
在此项目中,我从DataRowCollection
列ItemNo
获得了不同的值。我只对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),有没有更好的方法呢?
答案 0 :(得分:2)
// 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和参考必需品
答案 1 :(得分:1)
要从列中获取不同的值,您可以使用此方法:
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");
注意强>
如果您需要修剪值,可以更改上面的代码,然后首先创建DataTable
的克隆副本。然后通过将TRIM(column)
赋给Expression
列的属性,添加一个计算列,其中包含来自给定列名的修剪值,用于不同的值。然后按照上面代码中使用新剪裁列的步骤进行操作。