首页 > 解决方案 > 使用 LINQ 获取两个比较列表的结果并根据结果更改列表中的属性

问题描述

我有两个对象列表,假设第一个称为部门,第二个称为学生。

public class Student {

   public int Id {get; set; }

   public string Name {get; set; }

   public bool IsActive {get; set; }
  
   public int DepId {get;set;} 
}


 public class Department {

       public int DepId {get; set; }

       public string DepName {get; set; }
    }

备注:用户列表中充满了许多对象(超过 150 000 个项目)。

出于这个原因,我使用了Task.Run()

 private async Task UpdateMyGrid()
    {
       departments = ....; // list of departments 
       students = ..... ;  // list of students
        await Task.Run(() =>
        {
            var results = students.Where(x => departments.Any(y => y.DepId== x.DepId));

            foreach (var s in students)
            {
                if (results.ToList().Exists(p => p.DepId== s.DepId))
                {
                    s.IsEnabled = false;
                }
            }
            GridViewStudent.ItemsSource = null;
            GridViewStudent.ItemsSource = students;
        });
    }

我想比较两个用户和部门列表并获得它们之间的结果,然后将属性设置IsActive为 false 。

例子 :

List students: {1,"John",True,001} , {2,"Mariah",True,003},{3,"Karima",True,002},{4,"Jenny",True,004}

List departments: {001,"Science"} , {002,"Culture"}

预期结果:

 Results will be => {1,"John",True,001},{3,"Karima",True,002}

 Students will be => {1,"John",False,001} , {2,"Mariah",True,003},
{3,"Karima",False,002},{4,"Jenny",True,004}

我该怎么做才能使上述代码有效?

标签: c#wpflistlinq

解决方案


我认为您想提高性能。为此,您可以使用 Parallel.For 而不是 foreach 循环,因为您有很多对象。

            Parallel.ForEach(students, s =>
            {
               if (results.ToList().Exists(p => p.DepId== s.DepId))
                {
                    s.IsActive  = false;
                }
            });

它在 System.Threading.Tasks 中可用;


推荐阅读