c# - 如何动态克服列表对象的foreach循环
问题描述
我在某些条件下交换列表对象中的值并更新列表对象值。
目前,我正在做的是 - 通过列表循环每个对象 - 检查条件是否为净 - 交换值
public static void SwapMinMaxIfNull<T>(this IEnumerable<T> rows, string reportfor)
{
if (reportfor.Equals("Comparison"))
{
var row = rows as IEnumerable<RiskBoardDataToExport>;
try
{
if (rows.Any())
{
var Tests = row.Where(min => min.MinGaitSpeed == null && min.MaxGaitSpeed != null).ToList();
if (Tests != null)
{
foreach (RiskBoardDataToExport test in Tests)
{
test.MinGaitSpeed = test.MaxGaitSpeed;
test.MaxGaitSpeed = null;
}
}
// again check for next object
Tests = row.Where(min => min.MinTUGTime == null && min.MaxTUGTime != null).ToList();
if (Tests != null)
{
foreach (RiskBoardDataToExport test in Tests)
{
test.MinTUGTime = test.MaxTUGTime;
test.MaxTUGTime = null;
}
}
// again check for next object
Tests = row.Where(min => min.MinBergScoreSpeed == null && min.MaxBergScoreSpeed != null).ToList();
if (Tests != null)
{
foreach (RiskBoardDataToExport test in Tests)
{
test.MinBergScoreSpeed = test.MaxBergScoreSpeed;
test.MaxBergScoreSpeed = null;
}
}
//.. for brevity
}
}
}
我可以以更好的方式做到这一点吗?我知道 PropertyInfo 即可以检查属性名称并获取值等,但是没有任何提示可以完成此操作。
谢谢
解决方案
由于这是一个列表中项目的顺序无关紧要的操作,您可以通过并行化轻松加快此操作(您可以在此处阅读)。
因此,您应该做的是以并行方式处理这个 foreach 循环,并将其与 Rufus L 的优化代码结合起来,以获得最快的结果。
var rows = rows.Where(r =>
(r.MinGaitSpeed == null && r.MaxGaitSpeed != null) ||
(r.MinBergScoreSpeed == null && r.MaxBergScoreSpeed != null) ||
(r.MinBergScoreSpeed == null && r.MaxBergScoreSpeed != null))
Parallel.ForEach(rows, (row) => {
{
if (row.MinGaitSpeed == null)
{
row.MinGaitSpeed = row.MaxGaitSpeed;
row.MaxGaitSpeed = null;
}
if (row.MinTUGTime == null)
{
row.MinTUGTime = row.MaxTUGTime;
row.MaxTUGTime = null;
}
if (row.MinBergScoreSpeed == null)
{
row.MinBergScoreSpeed = row.MaxBergScoreSpeed;
row.MaxBergScoreSpeed = null;
}
}
请注意,这需要 System.Threading.Tasks 命名空间,这就是Parallel
类所在的位置。
推荐阅读
- python - Ray 集群配置 file_mounts 部分不允许工作节点启动
- ruby-on-rails - 如何在开发模式下访问加密凭据?
- python - 如何将 FFMPEG 导出到我的 Python 程序中?
- tensorboard - TensorBoard:如何添加电子邮件链接?
- javascript - 如何从此函数中获取 downloadURL?
- .net - grpc中的.net Google.Cloud.Firestore名称解析错误
- sql - 如何获得两条线之间的差异
- excel - Copy data to sheet named in column header and cell named at beginning of row, then loop
- angular - 根据剑道菜单中的服务数据在新选项卡中打开 url
- javascript - 无需单击按钮即可评估值的总和