【问题标题】:DataTable Filter From Code Side C#来自代码端 C# 的 DataTable 过滤器
【发布时间】:2011-06-14 13:50:05
【问题描述】:

我有一个 DataTable,它是通过用户上传 CSV 文档获得的,并且有这样的列、行:

Email      Age      Team
x@x.com    25       BarcelonaFC
y@y.com    32       BesiktasJK
z@z.com    18       Napoli
y@y.com    19       Boca Juniors
x@x.com    36       Internazionale

我需要先过滤该数据表,然后再将其插入数据库。电子邮件列应该是唯一的。所以我需要过滤该数据表,以便我得到消除 2 行的结果。我不想使用 LINQ,但如果它只是解决方案,没关系。

Email      Age      Team
x@x.com    25       BarcelonaFC
y@y.com    32       BesiktasJK
z@z.com    18       Napoli

【问题讨论】:

  • 为什么不想使用 LINQ?
  • 项目经理不希望我使用它:)
  • 我的代码非常简单,我得到 csv 文档并将其加载到数据表中,因为列是用逗号分隔的值决定的。 DataTable DtSubscribers = LoadUploadedCsvDocument(ViewState["UploadedCSVFilePath"].ToString());
  • 那么,什么是正确的值...给定电子邮件的第一个?之后什么都不管?
  • 是的,我必须丢失数据。那些将在之后

标签: c# .net filter datatable


【解决方案1】:

您可以创建一个 HashSet<string> 保存电子邮件地址,然后在表格中向后循环,将每一行的电子邮件地址添加到哈希集中,如果它已经存在(如果 Add 返回 false),则删除该行.

【讨论】:

  • 非常感谢,我会试试的,你能不能用 LINQ 提供一个替代解决方案。
  • LINQ 在这里用处不大;它用于查询,而不是修改。您可以通过写table.AsEnumerable().Select(r => r.Field<String>("Email")).Distinct() 获得独特的电子邮件
  • @Kelly:否则,您将在删除项目时跳过索引。
  • @Yagiz:我不知道你在问什么。
  • 这实际上效果很好@SLaks。我对 1.000.000 行的 HashTable 做了同样的事情,结果是 21 秒。 HashSet 产生了约 2 秒。重复逻辑的大集合。但是为什么倒退,你能把它清除掉吗?再次感谢
【解决方案2】:

你可以试试这样的......

var dt = new DataTable();
dt = yourCurrentDataTable.DefaultView.ToTable(true, "Email", "Age", "Team");

【讨论】:

  • 我已经这样做了,不会清除重复的行。您不能提供与指定列(电子邮件)不同的真实参数。
  • 正是我要去的地方...在给定的列上创建一个“不同”值的新表...
【解决方案3】:

您可以使用字典:

首先,你可以创建简单的类:

class Data
{
  public int Age;
  public string Team;
}

之后,您可以将数据插入字典:

Dictionary<string, MyData> dic = new Dictionary<string, MyData>();
foreach(DataRow row in YourDataTable)
{
  if(!dic.ContainsKey(row[.. email ..])) 
  {
    dic.Add(..., ...);
  }
}

现在你的字典准备好了......

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-02
    • 2023-03-28
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多