C# 将 List 类添加到新的 List 类而不循环

问题描述 投票:0回答:1

我有一个课程中返回的用户列表

我的班级:列表

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 的定义

c# asp.net-mvc object arraylist
1个回答
0
投票

您可以通过多种方式执行此操作,无需显式 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 通常很小。

© www.soinside.com 2019 - 2024. All rights reserved.