首页 > 编程语言 >.NET DataTable 去重过滤高级算法

.NET DataTable 去重过滤高级算法

时间:2024-03-31 10:11:19浏览次数:17  
标签:HashSet selectedNodesSet DataTable columnName 算法 var NET resultTable

 

/// <summary>
/// 过滤DataTalbe 添加处理(使用hashkey 处理) 最快
/// </summary>
/// <param name="dataTable"></param>
/// <param name="selectedNodes"></param>
/// <returns></returns>
public DataTable FilterDataTable(DataTable dataTable, List<string> selectedNodes)
{
// 使用HashSet而不是List来提高查找性能,如果不关键可以忽略这步
var selectedNodesSet = new HashSet<string>(selectedNodes.Select(n => n.Trim()), StringComparer.OrdinalIgnoreCase);

// 使用HashSet来存储我们已经添加过的行的hash值,只在选定列非常多时才有意义
var rowsAdded = new HashSet<int>();

// 创建新的DataTable的实例
DataTable resultTable = new DataTable();

// 添加所选的列
foreach (var column in dataTable.Columns.Cast<DataColumn>().Where(c => selectedNodesSet.Contains(c.ColumnName.Trim())))
{
resultTable.Columns.Add(column.ColumnName, column.DataType);
}

// 循环处理原始DataTable的每行
foreach (DataRow row in dataTable.Rows)
{
// 基于选中的列生成一个hash code作为去重的键
int hashCode = selectedNodesSet.Aggregate(17, (current, columnName) =>
current * 23 + (row[columnName]?.GetHashCode() ?? 0));

// 如果这个hash值尚未遇过,说明这是一个独一无二的行
if (rowsAdded.Add(hashCode))
{
// 用已选的列信息(如果它们存在的话)创建行
DataRow newRow = resultTable.NewRow();
foreach (var columnName in selectedNodesSet)
{
newRow[columnName] = row[columnName] ?? DBNull.Value;
}
resultTable.Rows.Add(newRow);
}
}

// 现在的resultTable已经包含了去重后的结果,因而直接返回即可
return resultTable;
}

  

标签:HashSet,selectedNodesSet,DataTable,columnName,算法,var,NET,resultTable
From: https://www.cnblogs.com/LowKeyCXY/p/18106426

相关文章

  • m基于深度学习的64QAM调制解调系统频偏估计和补偿算法matlab仿真
    1.算法仿真效果matlab2022a仿真结果如下:  算法涉及理论知识概要   2.2基于深度学习的频偏估计和补偿算法       基于深度学习的频偏估计和补偿算法利用深度神经网络来建立接收信号与频偏之间的非线性映射关系,通过训练网络模型来实现频偏的估计和补......
  • 算法 B树
    B树是一种自平衡的树形数据结构,用于解决磁盘存储器上的数据管理问题B树更适合做磁盘上的增删改查,而平衡二叉树和红黑树更适合做内存中的增删改查。因此B树广泛应用于数据库当中 某个节点的度:该节点的孩子数阶:所有节点中,孩子数最多的那个值 B树的特性:1.除根节点和叶子节......
  • 【两阶段鲁棒微网】【不确定性】基于关键场景辨别算法的两阶段鲁棒微网优化调度(Matlab
     ......
  • 力扣回溯算法--总结篇
    前言期末考试加上寒假两个月,一直没有动力,差不多三个月没写题了。最近写题也没有及时写文章总结,实在不知道如何开始,但是也得开始啊。干脆写个总结吧,再开始每天坚持写题写文章。玩了两个月,很多事情没有完成,很多东西也忘得差不多了,得抓紧时间捡起来,坚持输入,坚持输出。内容这些......
  • 卷积神经网络学习笔记——ZFNet(Tensorflow实现)
    完整代码及其数据,请移步小编的GitHub地址传送门:请点击我如果点击有误:https://github.com/LeBron-Jian/DeepLearningNote这个网络应该是CNN的鼻祖,早就出来了,这篇笔记也早就写完了,但是一直是未发布状态,估计是忘了。虽然说现在已经意义不大了,还是就当自己清理库存,温习......
  • 数据结构与算法——栈的使用
    栈是一种具有特定操作规则的数据结构,遵循先进后出(FILO)的原则,即最后进入的元素最先被访问或移除。栈通常用于需要临时存储数据,以及实现逆序输出、函数调用和表达式求值等场景。基本操作:创建栈、压栈(入栈)、弹栈(出栈)、获取栈顶元素、判断栈是否为空等。代码如下:importja......
  • Leetcode算法训练日记 | day9
    一、实现strStr函数1.题目Leetcode:第28题给你两个字符串haystack和needle,请你在haystack字符串中找出needle字符串的第一个匹配项的下标(下标从0开始)。如果needle不是haystack的一部分,则返回 -1。示例1:输入:haystack="sadbutsad",needle="sad"输......
  • 数据结构与算法——双向链表的使用原理
    双向链表是一种特殊链表,每个节点包含两个指针,一个指向前一个节点,一个指向后一个节点。双向链表可以支持双向遍历,插入和删除操作更加高效。双向链表的基本操作包括插入、删除、查找等。双向链表的常见应用场景包括LRU缓存淘汰算法、双向队列等需要频繁在两端进行操作的场景......
  • (算法)Lake Counting <Flood Fill 洪水灌溉模型>
    题目:题解:#include<stdio.h>intn,m;chararr[110][110];//元数据数组intcount=0;//计数器intdx[8]={1,1,1,-1,-1,-1,0,0};intdy[8]={-1,0,1,-1,0,1,1,-1};intt[110][110];//判断是否被选择voiddfs(intx,inty){for(inti=0;i<......
  • (算法) 入门——<迷宫问题>
    题目:题解:#include<stdio.h>intw,h;chararr[20][20];//初始值数组intt[20][20];//判断是否被选择的数组intdx[4]={0,0,-1,1};intdy[4]={1,-1,0,0};intcount=1;//计数器voiddfs(intx,inty){for(inti=0;i<4;i++)//暴力穷......