【问题标题】:Is there any alternate way of avoiding the Foreach loop? [closed]有没有其他方法可以避免 Foreach 循环? [关闭]
【发布时间】:2015-05-21 08:17:17
【问题描述】:

请看下面的代码

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; }
    }
}

我必须对员工的每条记录进行一些操作。此后,我将使用 foreach 循环。如果记录数增加,操作数也会同样增加。所以它将是O(N)。 有没有更好的方法呢?

注意~我不是在找.foreach()

【问题讨论】:

  • 您可以为所有员工发送一封电子邮件吗?
  • 您想检查每个员工并向他们发送电子邮件,但操作不能是 O(n)?
  • 发给每个员工的电子邮件是否相同?
  • 我使用了Parallel.Foreach...我做了一个基准标记,它很快。

标签: c# optimization foreach


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    卢安说的是对的。

    但是为了简化你的代码,你可以在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);
            }
    

    【讨论】:

    • 这实际上不会以任何明显的方式影响性能。实际迭代 9 项列表所花费的时间就是您要删除的所有时间,与发送电子邮件所花费的时间相比,这几乎是微不足道的。
    猜你喜欢
    • 2020-11-07
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-15
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多