DataView可以帮我们直接获取Distinct数据

本文介绍如何使用DataView在.NET中高效地获取DataTable中的Distinct数据,通过指定字段来实现数据的去重。
DataView可以帮我们直接获取Distinct数据
DataTable dataTable;
DataView dataView = dataTable.DefaultView;
DataTable dataTableDistinct = dataView.ToTable(true,"FieldName1","FieldName2","...");//注:其中ToTable()的第一个参数为是否DISTINCT
public static DataTable GetCompletedDataTable(DataView dataView) { if (dataView == null) throw new ArgumentNullException(nameof(dataView)); // 复制原始DataTable结构(不包含数据) DataTable resultTable = dataView.Table.Clone(); // 验证必需列 string[] requiredColumns = { "factoryDate", "bindef", "rn", "failrate" }; foreach (string col in requiredColumns) { if (!resultTable.Columns.Contains(col)) throw new ArgumentException($"DataTable缺少必需的列: {col}"); } // 步骤1: 获取基准时间序列(所有唯一tagetime) var allTagetimes = dataView.Table.AsEnumerable() .Select(row => row["factoryDate"]) .Distinct() .ToList(); // 如果无数据,返回空表 if (allTagetimes.Count == 0) return resultTable; // 步骤2: 获取所有唯一的(rn, bin)组合 var rnBinGroups = dataView.Table.AsEnumerable() .GroupBy(row => new { Rn = row["rn"], Bin = row["bindef"] }) .ToList(); // 步骤3: 处理每个分组 foreach (var group in rnBinGroups) { var currentRn = group.Key.Rn; var currentBin = group.Key.Bin; // 当前组的所有现有行(直接添加到结果表) foreach (DataRow existingRow in group) { resultTable.ImportRow(existingRow); } // 获取当前组的所有现有tagetime var existingTagetimes = group .Select(row => row["factoryDate"]) .ToList(); // 识别缺失的tagetime var missingTagetimes = allTagetimes .Except(existingTagetimes) .ToList(); // 获取参考行(用于prod和其他字段) var referenceRow = group.First(); // 添加缺失的行 foreach (var missingTagetime in missingTagetimes) { DataRow newRow = resultTable.NewRow(); newRow["factoryDate"] = missingTagetime; newRow["rn"] = currentRn; newRow["bindef"] = currentBin; newRow["failrate"] = 0.0; // 设置failrate为0 resultTable.Rows.Add(newRow); } } // 步骤1: 按 bin 和 rn 分组 var groupedData = resultTable.AsEnumerable() .GroupBy(row => new { Bin = row["bindef"], Rn = row["rn"] }).ToList(); // 步骤2: 组内按 tagtime 排序 var sortedGroups = new List<IEnumerable<DataRow>>(); foreach (var group in groupedData) { // 组内排序 var sortedGroup = group .OrderBy(row => ConvertToComparable(row["factoryDate"])) .ToList(); sortedGroups.Add(sortedGroup); } // 步骤3: 合并排序后的组 var finalSortedRows = sortedGroups .OrderBy(g => ConvertToComparable(g.First()["bindef"])) .ThenBy(g => ConvertToComparable(g.First()["rn"])) .SelectMany(g => g) .ToList(); // 步骤4: 替换原始数据 resultTable.Clear(); foreach (DataRow row in finalSortedRows) { DataRow newRow = resultTable.NewRow(); // 复制每个列的值 foreach (DataColumn col in resultTable.Columns) { newRow[col.ColumnName] = row[col.ColumnName]; } resultTable.Rows.Add(newRow); } return resultTable; }finalSortedRows 直接生成一个新的datatable
最新发布
10-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值