sunny123456

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  1796 随笔 :: 22 文章 :: 24 评论 :: 226万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

https://www.cnblogs.com/sunxi/p/4767577.html
第二种中增加变量。 string name,保存 遍历的到的 i的 name值。倒叙遍历,如果 与之相等。那么就移除 i+1的数据

业务需求

最近做一个把源数据库的数据批次导出到目标数据库。源数据库是采集程序采集而来的原始数据库,所以需要对其进行一些处理(过滤一些为空,长度太短或太长,非法字符,重复数据)然后在进行入库。

其中要避免目标库插入重复数据。这重复数据可能是源数据库本身就有重复数据,还有就是已经插入避免重复插入。

过滤自身重复数据解决方案

第一种:采用DataView.ToTable()方法

DataView.ToTable 方法

.NET Framework 2.0
 
根据现有 DataView 中的行,创建并返回一个新的 DataTable

重载列表

 
名称说明
DataView.ToTable () 根据现有 DataView 中的行,创建并返回一个新的 DataTable

由 .NET Compact Framework 支持。

DataView.ToTable (String) 根据现有 DataView 中的行,创建并返回一个新的 DataTable

由 .NET Compact Framework 支持。

DataView.ToTable (Boolean, String[]) 根据现有 DataView 中的行,创建并返回一个新的 DataTable

由 .NET Compact Framework 支持。

DataView.ToTable (String, Boolean, String[]) 根据现有 DataView 中的行,创建并返回一个新的 DataTable

由 .NET Compact Framework 支持。

实例代码

复制代码
复制代码
 public static DataTable Distinct(DataTable dt, string[] filedNames)
        {
            DataView dv = dt.DefaultView;
            DataTable DistTable = dv.ToTable("Dist", true, filedNames);
            return DistTable;
        }
复制代码
复制代码

 

第二种方法:循环遍历+DataTable.Select()

利用for循环遍历DataTable的数据行,利用DataTable.Select 方法判断是否重复,如果重复,则利用DataTable.Rows.RemoveAt(Index)删除重复的那一行。

具体看代码。

代码示例

复制代码
复制代码
 public DataTable GetDistinctSelf(DataTable SourceDt, string filedName)
        {
 for (int i = SourceDt.Rows.Count - 2; i > 0; i--)
            {
                DataRow[] rows = SourceDt.Select(string.Format("{0}='{1}'", filedName, SourceDt.Rows[i][filedName]));
                if (rows.Length > 1)
                {
                    SourceDt.Rows.RemoveAt(i);
                }
            }
         return SourceDt;
    }</span></pre>
复制代码
复制代码

第三种方法

利用双循环遍历(不推荐)

复制代码
复制代码
 public DataTable GetDistinctSelf(DataTable SourceDt, string filedName)
        {
            for (int i = SourceDt.Rows.Count - 2; i > 0; i--)
            {
                string title = SourceDt.Rows[0][filedName].ToString();
                for (int j = i + 1; j > 0; i--)
                {
                    if (SourceDt.Rows[j][filedName].ToString() == title)
                    {
                        SourceDt.Rows.RemoveAt(i);
                }
            }

        }
        </span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> SourceDt;
      }</span></pre>
复制代码
复制代码

 

posted on   sunny123456  阅读(675)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示