【问题标题】:Efficient way to Find and Replace values in DataColumn在 DataColumn 中查找和替换值的有效方法
【发布时间】:2013-06-24 15:28:23
【问题描述】:

我有一个包含一个 DataTable 的数据集,该表有 3 列(Column1、Data、Column2)和多个数据行。

我还有一个字典,其中包含我需要在 DataColumn 中搜索的值列表以及我应该用哪些值替换原始值。

我想在名称为“数据”的列中搜索。

下图包含原始数据表和生成的数据表以及包含需要搜索和替换的键和值的字典。

执行此操作的最有效方法是什么?

【问题讨论】:

  • 我会想到在 T-SQL 中?
  • 到目前为止你尝试了什么?
  • 我正在执行 MDX 查询并取回数据。所以我必须使用 C# 修改数据。我知道我检查列名是否为“数据”,然后我可以遍历行,然后查找并替换该值。我不想去那个地方

标签: c# .net c#-4.0 datatable datatable.select


【解决方案1】:

我确信使用 LinQ 有最好的方法,但是这样做可以

Dictionary<string,string> dic = new Dictionary<string,string>();
dic.Add("AAA", "A++");
dic.Add("BBB", "B++");
foreach(KeyValuePair<string, string> kvp in dic)
{
    DataRow[] sl = dt.Select("DATA='" + kvp.Key + "'");
    foreach(DataRow r in sl)
        r["DATA"] = kvp.Value;
}

内部的foreach循环可以用表达式代替

 sl.ToList().ForEach(x => x.SetField<string>("DATA", kvp.Value));

但我还没有测试性能

对于大型数据集可能效率不高,但应该考虑的是循环字典键而不是表的单行。

【讨论】:

    【解决方案2】:

    我会这样处理:

    DataSet ds = new DataSet();
    string strNewXmls = ds.GetXml().Replace("AAA", "A++");
    System.IO.StringReader srXmlStringReader = new System.IO.StringReader(strNewXmls);
    ds.ReadXml(srXmlStringReader, XmlReadMode.IgnoreSchema);
    

    这是一个快速简单的解决方案。您可以对整个 DataSet 中的各种内容执行此操作。

    希望对你有帮助,

    塔拉涅蒂

    【讨论】:

      【解决方案3】:

      为了简单

      foreach (DataRow row in dataSet.Tables[0].AsEnumerable())
      {
        string data = row.Field<string>("Data");
      
        string newData = null;
        if (dict.TryGetValue(data, out newData))
        {
          row.SetField("Data", newData);
        }
      }
      

      (您需要将System.Data.DataSetExtensions 添加到您的项目引用中)

      【讨论】:

        猜你喜欢
        • 2016-06-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-20
        • 1970-01-01
        • 2012-02-12
        • 1970-01-01
        • 2016-12-05
        相关资源
        最近更新 更多