有没有其他方法可以避免 Foreach 循环?

Is there any alternate way of avoiding the Foreach loop?

请看下面的代码

using System.Collections.Generic;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            List<Employee> employeeCollection = new List<Employee>();
            for (int i = 1; i < 10; i++) employeeCollection.Add(new Employee {
                EmployeeID = i, 
                EmployeeName = string.Concat("Employee", i),
                Email = string.Concat("Email", i) });


            //loop thru every record
            foreach (Employee e in employeeCollection)
            {
                SendEMail(e);
            }
        }

        private static void SendEMail(Employee employee)
        {
            // do something
        }        

    }


    class Employee
    {
        public int EmployeeID { get; set; }
        public string EmployeeName { get; set; }
        public string Email { get; set; }
    }
}

我必须对Employee的每条记录做一些操作。从今以后,我将使用 foreach 循环。如果记录的数量增加,操作的数量将同样增加。所以它将是 O(N)。 对此有更好的方法吗?

N.B.~我不是在找.foreach()

不用担心 O(N)。关于现实生活中的性能,简单的算法复杂性很少是一个好的答案。昂贵的部分不是遍历员工列表,而是发送电子邮件。

例如,如果您的要求允许,您可以将一封电子邮件与多个收件人一起使用 - 当然,这只有在所有电子邮件都相同的情况下才有效。否则,在某种程度上,您只需发送 n 封单独的电子邮件。

当然,即便如此,仍然有很多方法可以提高感知性能。您可以一次将所有电子邮件排队,并向用户显示他们正在排队等候,而不是阻止 UI。您可以并行发送每封电子邮件。您可以将电子邮件发送到其他服务(例如 Microsoft Exchange)以处理 实际 为您发送的邮件。

最后,如果您要发送 100 封不同的电子邮件,则必须发送 100 封电子邮件。没有聪明的算法可以帮助你。

栾安说的对

但是为了简化您的代码,您可以在 employeeCollection 中添加 employee 的同时发送电子邮件,而无需再次循环 employeeCollection 来发送电子邮件。

像这样。

 for (int i = 1; i < 10; i++)
        {
            var emp = new Employee
                {
                    EmployeeID = i,
                    EmployeeName = string.Concat("Employee", i),
                    Email = string.Concat("Email", i)
                };
            employeeCollection.Add(emp);

            SendEMail(emp);
        }