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

时间:2015-03-18 13:50:19

标签: c# optimization foreach

请查看以下代码

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()

2 个答案:

答案 0 :(得分:5)

不要为O(N)而烦恼。对于现实生活中的表现,简单的算法复杂性很少是一个很好的答案。昂贵的部分不是在员工名单上迭代,而是发送电子邮件。

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

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

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

答案 1 :(得分:0)

Lua所说的是对的。

但是为了简化您的代码,您可以在employeeCollection中添加员工时发送电子邮件,您无需再次循环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);
        }