我有兩個物件串列,假設第一個稱為 Department,第二個稱為 Student。
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}
我該怎么做才能使上述代碼正常作業?
uj5u.com熱心網友回復:
我認為您想提高性能。為此,您可以使用 Parallel.For 而不是 foreach 回圈,因為您有很多物件。
Parallel.ForEach(students, s =>
{
if (results.ToList().Exists(p => p.DepId== s.DepId))
{
s.IsActive = false;
}
});
它在 System.Threading.Tasks 中可用;
uj5u.com熱心網友回復:
嘗試這個
private async Task UpdateMyGrid()
{
await Task.Run(() =>
{
foreach (var s in students)
{
if (departments.Exists(p => p.DepId == s.DepId))
{
s.IsActive= true;
}else s.IsActive=false;
}
GridViewStudent.ItemsSource = null;
GridViewStudent.ItemsSource = students;
});
}
輸出
1 John True 1
2 Mariah False 3
3 Karima True 2
4 Jenny False 4
或者如果您出于某種原因期望相反,您可以使用它,并且它也在使用 TPL 庫
await Task.Run(() =>
{
Parallel.ForEach(students, s =>
{
if (departments.Exists(p => p.DepId == s.DepId))
{
s.IsActive= false;
}else s.IsActive=true;
});
輸出
1 John False 1
2 Mariah True 3
3 Karima False 2
4 Jenny True 4
但恕我直言,最快的方法是如果您已經在資料庫服務器中左加入學生和部門
var students = await (from s in context.students
join d in context.departments on s.DepId equals d.DepId into gj
from d in gj.DefaultIfEmpty()
select new Student
{
Id=s.Id,
Name=s.Name,
DepId=s.DepId,
DepExist= d==null?false: true,
} ).ToListAsync();
Parallel.ForEach(students, s =>
{
s.IsActive = s.DepExist;
});
在這種情況下,您需要向 student 再添加一個屬性
[NotMapped]
public bool DepExist { get; set; }
uj5u.com熱心網友回復:
將部門 ID 存盤在一個HashSet<int>:
var hashSet = new HashSet<int>(departments.Select(x => x.DepId));
...并遍歷學生:
var results = new List<Student>();
foreach (var student in students)
{
if (hashSet.Contains(student.DepId)
{
results.Add(student);
student.IsActive = false;
}
}
由于Student每個學生只有一個物件,因此該IsActive屬性不能true在一個集合和false另一個集合中。如果您想要兩個不同的物件,您應該克隆原始物件。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/315361.html
