【问题标题】:Get distinct values from a column of DataTable in .NET 2.0从 .NET 2.0 中的 DataTable 列中获取不同的值
【发布时间】:2016-07-28 04:43:08
【问题描述】:

我正在处理一个使用 .NET Framework 2.0 开发的遗留项目。 在这个项目中,我通过ItemNo 列从DataRowCollection 获得不同的值。我只对ItemNo 感兴趣。 DataRowItemNoQtyDate 组成。

我正在考虑迭代 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中找到specific itemif(!items.Contains(itemNo)) { items.Add(itemNo); }
  • 不要在您的收藏中运行 n^2 并为您的项目使用字典
  • 您的意思是您需要来自ITEMNO 列的不同值吗?
  • @RezaAghaei ,是 ITEMNO 的唯一值

标签: c# datatable .net-2.0 datarowcollection


【解决方案1】:
// 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);

在 Dictionary 上使用 HashSet 的好处无疑是微不足道的,但我更喜欢它,因为我不关心字典中的任意 bool 值,但您需要满足 .Net 3.5 和参考要求.

【讨论】:

    【解决方案2】:

    要从列中获取不同的值,您可以使用以下方法:

    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 属性来从给定列名称中修剪值以获得不同的值。然后按照上面的代码使用新的修剪列的步骤。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 2013-02-11
      • 2021-10-16
      • 2013-07-02
      相关资源
      最近更新 更多