以下 ProjectEnrolment 定义项目中的用户及其在其中的注册类型:
public class ProjectEnrolment {
public Project Project { get; set; }
public User User { get; set; }
public EnrolmentType EnrolmentType { get; set; }
}
出于测试目的,我需要创建一个 ProjectEnrolments 列表,其中:
1. 每个项目必须有多个ProjectEnrolment;
2. 一个用户不能在一个项目中出现两次。
我尝试了以下方法:
List<ProjectEnrolment> projectEnrolments =
projects.SelectMany(x =>
users.SelectMany(y =>
enrolmentTypes.Select(z =>
new ProjectEnrolment {
EnrolmentType = z,
Project = x,
User = y
})))
.GroupBy(u => u.Project)
.Select(v => v.OrderBy(w => Guid.NewGuid()).FirstOrDefault())
.ToList();
但这为我提供了每个项目一个 ProjectEnrolment,这不是我所需要的。
最佳答案
虽然我可能不会使用 SelectMany
和其他 linq 方法在一条指令中执行您想要的操作。这是一个相当复杂的逻辑,最终的指令将不可读。这个怎么样:
Random r = new Random();
IList<ProjectEnrolment> projectEnrolments = new List<ProjectEnrolment>();
foreach (Project project in projects)
{
int firstUser = r.Next(users.Count);
projectEnrolments.Add(new ProjectEnrolment {
EnrolmentType = enrolmentTypes[r.Next(enrolmentTypes.Count)],
Project = project,
User = users[firstUser]
});
int secondUser;
do {
secondUser = r.Next(users.Count);
} while (secondUser == firstUser);
projectEnrolments.Add(new ProjectEnrolment {
EnrolmentType = enrolmentTypes[r.Next(enrolmentTypes.Count)],
Project = project,
User = users[secondUser]
});
}
使用 Linq 的版本
IList<ProjectEnrolment> projectEnrolments = projects.SelectMany(p => users.OrderBy(u => Guid.NewGuid()).Take(2).Select(u => new ProjectEnrolment {
EnrolmentType = enrolmentTypes.OrderBy(t => Guid.NewGuid()).FirstOrDefault(),
Project = p,
User = u
})).ToList();
关于c# - 使用 SelectMany 和 GroupBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43661143/