我有一个课程中返回的用户列表
我的班级:列表
public class EmployeeList
{
public int Emp_No { get; set; }
public string Sys_Prefix { get; set; }
public short Company_No { get; set; }
public string Surname { get; set; }
public string First_Name { get; set; }
public string Known_As { get; set; }
public string Initials { get; set; }
public string Title { get; set; }
}
在不循环遍历此类结果的情况下,我想将结果添加到新列表中
var newsFeedEmps = new List<NewsFeedEmployees>();
public partial class NewsFeedEmployees
{
public long Company_No { get; set; }
public long Emp_No { get; set; }
public long SourceId { get; set; }
public string Sys_Prefix { get; set; }
public long NewsFeedID { get; set; }
public bool isActive { get; set; }
}
我无法使用 newsFeedEmps.AddRange(EmployeeList),因为并非所有参数都匹配,我将为完整列表的 NewsFeedID 和 isActive 分配一个单独的值
我不想使用 foreach 循环来循环第一个列表并执行 newsFeedEmps.Add(new .... ) 我发现一个单独的帖子提到了
Queue<NewsFeedEmployees> myQueue = new Queue<NewsFeedEmployees>();
myQueue.EnqueueRange(emps.Select(emp => new NewsFeedEmployees()
{
Company_No = emp.Company_No,
Emp_No = emp.Emp_No,
}));
但是我收到一个错误,队列不包含 EnqueueRange 的定义
您可以通过多种方式执行此操作,无需显式 for 循环,但如果目标是
我非常有信心,你不可能做得比 O(n) (实际上是 θ(n))更好。
这里有一种方法可以避免显式的
for
循环。如果你想使用已经内置的东西,你可以这样编写操作:
Queue<NewsFeedEmployees> myQueue = new Queue<NewsFeedEmployees>();
emps.Select(emp => new NewsFeedEmployees
{
Company_No = emp.Company_No,
Emp_No = emp.Emp_No,
})
.ToList()
.ForEach(myQueue.Enqueue);
不幸的是,
ForEach
仅适用于List<T>
,这就是为什么需要ToList()
。
这实际上循环了
emps
两次,但仍然有 θ(n) 运行时间。
那么,您可能会认为,您可以直接在
ForEach
上编写自己的 IEnumerable<T>
扩展方法,虽然您可以,正如 Eric Lippert 所解释的,但这样做没有多大意义。
但是,如果我们假设
emps
已经是 List<EmployeeList>
,你也可以这样做:
Queue<NewsFeedEmployees> myQueue = new Queue<NewsFeedEmployees>();
emps.ForEach(emp => myQueue.Enqueue(new NewsFeedEmployees
{
Company_No = emp.Company_No,
Emp_No = emp.Emp_No,
}));
这至少只隐式循环
emps
一次。它仍然是 θ(n),尽管理论上它是之前建议的两倍。
无论如何,
List<T>.ForEach
都会循环浏览列表一次,我有信心地说你不能做得更好。
在 F# 或 Haskell 这样的语言中,可以使用递归而不是显式循环来实现相同类型的操作,但它仍然是一个 θ(n) 操作。
不过,最终,除非您拥有数百万条记录,否则请不要担心。正如 Rob Pike 所说,
n 通常很小。