UiPath LINQ实现:识别同列相反值并更新对应列
UiPath中用LINQ匹配相反值并更新对应列
核心逻辑
针对需求——匹配C列中互为相反数的行,将未标记Credit/Debit的正数行的D列改为Debit,可以通过按绝对值分组+组内匹配的LINQ逻辑实现,一步完成筛选与更新。
实现代码(UiPath Assign活动中使用)
假设数据存储在DataTable变量dtData中,直接在Assign活动的右侧输入以下VB.NET风格的LINQ代码:
dtData = dtData.AsEnumerable().GroupBy(Function(row) Math.Abs(Convert.ToDecimal(row("C")))).SelectMany(Function(group) ' 筛选当前组内:C列为负数、且D列已标记Credit/Debit的行(待匹配的源行) Dim negativeTargetRows = group.Where(Function(r) Convert.ToDecimal(r("C")) < 0 AndAlso (r("D").ToString().Equals("Credit", StringComparison.OrdinalIgnoreCase) OrElse r("D").ToString().Equals("Debit", StringComparison.OrdinalIgnoreCase)) ).ToList() ' 筛选当前组内:C列为正数、且D列未标记Credit/Debit的行(待更新的目标行) Dim positiveUpdateRows = group.Where(Function(r) Convert.ToDecimal(r("C")) > 0 AndAlso Not r("D").ToString().Equals("Credit", StringComparison.OrdinalIgnoreCase) AndAlso Not r("D").ToString().Equals("Debit", StringComparison.OrdinalIgnoreCase) ).ToList() ' 为每个源行匹配一个目标行并更新 For Each negRow In negativeTargetRows Dim matchRow = positiveUpdateRows.FirstOrDefault() If matchRow IsNot Nothing Then matchRow("D") = "Debit" positiveUpdateRows.Remove(matchRow) ' 避免重复匹配 End If Next Return group ' 返回处理后的整组数据 ).CopyToDataTable()
代码说明
- 分组逻辑:通过
Math.Abs(Convert.ToDecimal(row("C")))将所有绝对值相同的行分到一组,确保互为相反数的行在同一组内。 - 筛选行:
negativeTargetRows:定位需要匹配的“源行”(比如例子中的C4,值为-1且D列是Credit/Debit)positiveUpdateRows:定位需要更新的“目标行”(比如例子中的C3,值为1且D列未标记)
- 匹配与更新:遍历源行,为每个源行找到第一个可用的目标行,将其D列改为
Debit,并移除已匹配的目标行防止重复使用。 - 返回结果:将所有处理后的行重新组合成新的DataTable,覆盖原变量。
注意事项
- 确保C列的单元格是数值类型(decimal/double),如果是字符串需要先做类型转换,避免转换异常。
- 如果需要支持双向匹配(比如正数行标记为Credit时,匹配负数行更新),可以复制一段逻辑,调整正负筛选条件和更新值即可。
- 若存在多个相同绝对值的相反值,代码会按行顺序匹配,先出现的源行会优先匹配先出现的目标行。
内容的提问来源于stack exchange,提问作者JKL
相关产品推荐
相关产品推荐

