在.NET 2.0中从DataTable的一列获取不同的值

3
我正在处理一个使用.NET Framework 2.0开发的传统项目。 在这个项目中,我通过ItemNo列从DataRowCollection获取不同的值。我只对ItemNo感兴趣。该DataRow包含ItemNoQtyDate
我考虑遍历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)


你可以使用 Contains 方法从 List 中查找特定项。如果列表中不存在该项,则执行以下操作:if(!items.Contains(itemNo)) { items.Add(itemNo); } - mmushtaq
怎么样,不要在你的集合上运行n ^ 2,而是使用字典来存储项目。 - Didaxis
你的意思是需要从“ITEMNO”列获取不同的值吗? - Reza Aghaei
@RezaAghaei,是的,ITEMNO需要唯一值。 - Alan B
2个回答

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而不是Dictionary的好处虽然微不足道,但我更喜欢它,因为我不关心字典中的任意布尔值,但您需要满足.Net 3.5和引用要求。

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 属性。然后按照上面的代码使用新修剪的列执行步骤。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接