请查看以下代码
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()
答案 0 :(得分:5)
不要为O(N)
而烦恼。对于现实生活中的表现,简单的算法复杂性很少是一个很好的答案。昂贵的部分不是在员工名单上迭代,而是发送电子邮件。
如果您的要求允许,您可以使用包含多个收件人的单个电子邮件,当然,这仅在所有电子邮件都相同的情况下才有效。否则,在某种程度上,您只需发送 n 单独的电子邮件。
当然,即便如此,仍然有很多方法可以改善感知性能。您可以一次排队所有电子邮件,并向队列中显示他们正在等待的用户,而不是阻止UI。您可以并行发送每封电子邮件。您可以将电子邮件发送到其他服务(例如Microsoft Exchange)以处理实际发送给您。
但最后,如果您要发送100封不同的电子邮件,则必须发送100封电子邮件。没有聪明的算法可以帮助你。
答案 1 :(得分:0)
但是为了简化您的代码,您可以在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);
}