如何使这些foreach循环高效?

时间:2010-06-30 10:39:34

标签: c#

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

 foreach (PatchFacilityManager PM in patchFacilityManager)
 {
     foreach (int FM in facilityManagerId)
     {
         if (PM.FacilityManagerId == FM)
         {
             PM.IsSelected = true;
         }
     }
 }

7 个答案:

答案 0 :(得分:7)

这是一种方式,

    foreach (PatchFacilityManager PM in patchFacilityManager)
    {
        PM.IsSelected = facilityManagerId.Contains(PM.FacilityManagerId);
    }

修改

与问题中给出的代码相比,此解决方案在两种三种方式中效率很高。

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

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

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

答案 1 :(得分:1)

patchFacilityManager
.Where(c => facilityManagerId.Contains(c.FacilityManagerId))
.ForEach(c => c.IsSelected = true);

答案 2 :(得分:1)

var ids = new HashSet<int>(facilityManagerId);
foreach (PatchFacilityManager pfm in patchFacilityManager)
{
    if (ids.Contains(pfm.FacilityManagerId))
        pfm.IsSelected = true;
}

答案 3 :(得分:0)

您可以按照排序顺序将设施管理员ID存储在数组中,然后使用BinarySearch而不是foreach进行查找。

答案 4 :(得分:0)

patchFacilityManager
   .Where(m => facilityManagerId.Contains(m.FacilityManagerId))
   .ToList()
   .ForEach(m => m.IsSelected = true);

patchFacilityManager
   .Join(facilityManagerId, m => m.FacilityManagerId, f => f, (m,f) => m)
   .ToList()
   .ForEach(m => m.IsSelected = true);

答案 5 :(得分:0)

使用LINQ语法的另一种变体:

var match = for PM in patchFacilityManager
            join FM in facilityManager on PM.FacilityManagerId equals FM
            select PM;
foreach(var PM in match)
{
   PM.IsSelected = true;
}

答案 6 :(得分:0)

只是为了娱乐和开箱即用 - 列表排序时的方法:

static void Main(string[] args)
        {
            List<int> nums = new List<int>(new int[] { 1, 2, 3, 4, 5, 6, 7, 8 });
            List<int> ids = new List<int>(new int[] { 2, 4, 5 });

            for (int i = 0, j = 0; i < nums.Count && j < ids.Count; i++)
            {
                int num = nums[i];
                int id = ids[j];

                if (num == id)
                {
                    Console.WriteLine("Match = " + id);
                    j++;
                }
            }

            Console.ReadLine();
        }

我认为不知道这个想法的性能优势或贬低。当然你可以修改它以使用主foreach作为数字,如果你对fors过敏,你可以手动使用主foreach中的ID的枚举器。