我有(PatchFacilityManager)列表和(Int)facilityManagerId列表。我想使下面的代码有效。有没有办法删除这两个foreach循环。
foreach (PatchFacilityManager PM in patchFacilityManager)
{
foreach (int FM in facilityManagerId)
{
if (PM.FacilityManagerId == FM)
{
PM.IsSelected = true;
}
}
}
答案 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的枚举器。