如何使这些foreach循环高效?

Roh*_*nsi 4 c#

我有(PatchFacilityManager)列表和(Int)facilityManagerId列表.我想使下面的代码有效.有没有办法删除这两个foreach循环.

 foreach (PatchFacilityManager PM in patchFacilityManager)
 {
     foreach (int FM in facilityManagerId)
     {
         if (PM.FacilityManagerId == FM)
         {
             PM.IsSelected = true;
         }
     }
 }
Run Code Online (Sandbox Code Playgroud)

thi*_*eek 7

这是一种方式,

    foreach (PatchFacilityManager PM in patchFacilityManager)
    {
        PM.IsSelected = facilityManagerId.Contains(PM.FacilityManagerId);
    }
Run Code Online (Sandbox Code Playgroud)

编辑

与问题中给出的代码相比,该解决方案在两种方式上是有效的.

首先,它不测试条件,表达式的结果直接分配到PM.IsSelected中.根据LukeH的评论,必须不将PM.IsSelected设置为false,因此条件是不可避免的.但是,如果被要求将其设置为false,则此改进适用..从提问者的评论来看,他的案例似乎与这种优化有关.所以不需要条件赋值.

其次,它不会遍历整个列表,因为List.Contains(int),返回true并在第一次出现在参数中传递的int时出现循环.

第三,当框架为您提供List.Contains(int)功能时,为什么要重新发明轮子.因此从维护角度来看,这也更有效.

  • 我认为你应该为`.Contains`调用使用`new HashSet <int>(facilityManagerId)`.我错了吗? (2认同)
  • 唯一的优化是它在找到元素时停止的事实.循环中缺少终止条件是上述代码中的错误.List <T> .Contains的内部实现从根本上说并不比上面的方法快.如果你真的希望它运行得更快,你需要使用HashTables.例如,HashTable.Contains在O(1)时间内运行.是的,您有创建HashTable的开销,但这可能会远远低于上述算法的总体成本. (2认同)