Linq比较两个列表并创建一个新列表

时间:2012-12-13 10:01:40

标签: c# linq

我正在研究一个MVC4项目,我需要通过比较两个列表来创建一个新的对象列表。下面的db指的是DbContext对象。

在我工作的项目中,我需要比较两个列表。第一个是一学期提供的所有科目。另一个是学生选择的科目。

List<Subject> subjects = db.Subjects;
//...
List<Subject> semesterSubjects = student.Subjects;

在这两个列表中,我需要创建一个项目列表,指出是否每个项目都被选中。它看起来像这样。

class SubjectSelection
{
public int ID { get; set; }
public String Title { get; set; }
public bool IsSelected { get; set; }
}

我现在需要的是比较subjects&amp; semesterSubjects并获得IEnumerable<SubjectSelection>

我可以使用Linq获得这样的结果吗?

2 个答案:

答案 0 :(得分:2)

最好的方法是在服务器端完成这项工作。从学期科目中选择ID:

var selectedIDs = semesterSubjects.Select(s => s.ID).ToList();

并传递给他们查询:

var query = db.Subjects.Select(s => new SubjectSelection()
                     {
                        ID = s.ID,
                        Title = s.Title,
                        IsSelected = selectedIDs.Contains(s.ID)
                     });

如果您使用相同的数据库上下文实例来检索学期科目列表和科目列表,那么您只需使用:

var query = subjects.Select(s => new SubjectSelection()
                     {
                        ID = s.ID,
                        Title = s.Title,
                        IsSelected = semesterSubjects.Contains(s)
                     });

实体框架实现了身份映射模式,这意味着它返回主题对象的内存中实例,由不同的查询返回。

答案 1 :(得分:0)

var allSubjectsWithSelection = subjects.Select(o=>new SubjectSelection(){ID = o.ID,Title = o.Title, IsSelected = semesterSubjects.Any(s=>s.ID == o.ID)}).ToList();