C# 以线程安全的方式压缩列表

C# 以线程安全的方式压缩列表,c#,multithreading,list,C#,Multithreading,List,目前,我正在使用以下伪代码: List<MyMail> m = new List<MyMail>(); foreach(var user in users) { var mails = mailLibrary.getAllMails(user); // synchronously; 100ms waiting time foreach(var mail in mails) m.add(mail); } return m.ToArray(); List m

目前,我正在使用以下伪代码:

List<MyMail> m = new List<MyMail>();
foreach(var user in users) {
    var mails = mailLibrary.getAllMails(user); // synchronously; 100ms waiting time
    foreach(var mail in mails) m.add(mail);
}
return m.ToArray();
List m=新列表();
foreach(用户中的var用户){
var mails=mailLibrary.GetAllMail(用户);//同步;100毫秒等待时间
foreach(邮件中的var邮件)m.add(邮件);
}
返回m.ToArray();
现在我想并行获取所有用户的邮件,因为邮件库是同步编写的,并且涉及多个邮件服务器。 不过,列表的排序方式应该与以前相同。所以我会试试

List<MyMail> m = new List<MyMail>();
Parallel.ForEach(users,user => {
    List<MyMail> innerM = new List<MyMail>();
    var mails = mailLibrary.getAllMails(user); // synchronously; 100ms waiting time
    foreach(var mail in mails) innerM.add(mail);
    // How to zip innerM list content into m such that content is at the correct position?
});
return m.ToArray();
List m=新列表();
Parallel.ForEach(用户,用户=>{
List innerM=新列表();
var mails=mailLibrary.GetAllMail(用户);//同步;100毫秒等待时间
foreach(邮件中的var邮件)innerM.add(邮件);
//如何将innerM列表内容压缩到m中,以使内容位于正确的位置?
});
返回m.ToArray();

如何将
innerM
压缩到
m
的正确位置?

您考虑过使用并行LINQ吗

return users.AsParallel().AsOrdered()
            .SelectMany(user => mailLibrary.getAllMails(user))
            .ToArray();

我相信这样做是正确的,在维护所有顺序方面,根据。

您考虑过使用并行LINQ吗

return users.AsParallel().AsOrdered()
            .SelectMany(user => mailLibrary.getAllMails(user))
            .ToArray();

我相信在维护所有顺序方面,这是正确的做法。

这是什么编程语言?这是什么编程语言?标记一致如果SelectMany在保存顺序方面不受支持,他可以稍后使用Select和flatten。@usr:
SelectMany
绝对受支持;问题是订货是否完全符合要求。文档让我怀疑它是。@JonSkeet它确实保留了原始集合/枚举中的顺序,至少在我迄今为止使用过的每种情况下:),它确实保留了我能够测试的顺序。如果在保留顺序方面不支持SelectMany,他以后可以使用Select和flatten。@usr:
SelectMany
绝对受支持;问题是订货是否完全符合要求。文档让我怀疑它是。@JonSkeet它确实保留了原始集合/枚举中的顺序,至少在我迄今为止使用过的每种情况下:),它确实保留了我所能测试到的顺序。