您的位置:

c# List.ForEach详解

一、List.ForEach概述

在c#中,List 是一个常用的集合类型,提供很多常用的方法,如Add、Remove、Contains等。而List.ForEach方法则是一个更加高效且方便的遍历List的方法,它可以避免使用for循环、数组下标等不便捷的方式去遍历List,在Lambda表达式中更加清晰地表达代码的意图。List.ForEach的使用方法如下:

List nums = new List
    { 1, 2, 3 };
nums.ForEach(num => Console.WriteLine(num));

   
  

上述代码将会输出1、2、3,forEach方法接收一个Action类型的参数,该参数是一个Lambda表达式,可以对list中的每一个元素进行处理。

二、Cba赛程

c# List.ForEach方法可以遍历任何类型的List,包括复杂的对象列表。一个常见的例子是,我们需要查询某个赛事的比赛场次时间和地点,并打印出来。假设我们有一个包含赛程信息的Match类,Match类具有属性Date、Location,Match类的列表可以使用List 来表示:

public class Match
{
    public DateTime Date { get; set; }
    public string Location { get; set; }
}

List matches = new List
   
{
    new Match { Date = new DateTime(2022, 01, 01, 12, 0, 0), Location = "张家港市体育馆" },
    new Match { Date = new DateTime(2022, 01, 03, 10, 0, 0), Location = "前卫体育中心" },
    new Match { Date = new DateTime(2022, 01, 05, 14, 0, 0), Location = "沃德体育馆" }
};

matches.ForEach(match => Console.WriteLine($"时间:{match.Date},地点:{match.Location}"));

   
  

输出的结果为:

时间:2022/1/1 12:00:00,地点:张家港市体育馆
时间:2022/1/3 10:00:00,地点:前卫体育中心
时间:2022/1/5 14:00:00,地点:沃德体育馆

三、Clash

在复杂的场景下,List.ForEach方法可以帮助我们简化代码,比如可以用它来遍历嵌套的列表。假设我们需要查询一组玩家的个人信息,每个玩家都有一个Name和一个Score列表,Score列表包含若干个得分项。

public class Player
{
    public string Name { get; set; }
    public List Scores { get; set; }
}

List
    players = new List
    
{
    new Player { Name = "玩家1", Scores = new List
      { 98, 80, 88 } },
    new Player { Name = "玩家2", Scores = new List
       { 90, 91, 89 } },
    new Player { Name = "玩家3", Scores = new List
       
        { 81, 79, 83 } } }; players.ForEach(player => { Console.Write($"玩家:{player.Name},成绩:"); player.Scores.ForEach(score => Console.Write($"{score} ")); Console.WriteLine(); });
       
      
     
    
   
  

输出的结果为:

玩家:玩家1,成绩:98 80 88 
玩家:玩家2,成绩:90 91 89 
玩家:玩家3,成绩:81 79 83 

四、CCTV5节目表

c# List.ForEach方法还可以和LINQ方法一起使用,帮助我们快速查询和筛选数据。以下示例是一个使用List和LINQ查询CCTV5节目表的例子,列表每个元素包含一个时间段和一个节目名称。

List<(DateTime Start, DateTime End, string Program)> programList = new List<(DateTime, DateTime, string)>
{
    (new DateTime(2022, 1, 1, 8, 00, 0), new DateTime(2022, 1, 1, 10, 0, 0), "体育节目1"),
    (new DateTime(2022, 1, 1, 10, 00, 0), new DateTime(2022, 1, 1, 12, 0, 0), "NBA直播"),
    (new DateTime(2022, 1, 2, 10, 00, 0), new DateTime(2022, 1, 2, 12, 0, 0), "NBA直播"),
    (new DateTime(2022, 1, 2, 12, 30, 0), new DateTime(2022, 1, 2, 14, 0, 0), "体育节目2")
};

// 按照时间升序排序,并筛选出2022年1月1日的节目
programList.OrderBy(p => p.Start)
    .Where(p => p.Start.Year == 2022 && p.Start.Month == 1 && p.Start.Day == 1)
    .ToList()
    .ForEach(p => Console.WriteLine($"{p.Start.ToString("HH:mm")} - {p.End.ToString("HH:mm")}:{p.Program}"));

输出的结果为:

08:00 - 10:00:体育节目1
10:00 - 12:00:NBA直播

五、CBA

c# List.ForEach方法的使用场景非常广泛,例如批量修改集合中的数据,或者根据集合中的数据更新数据库等等。这里我们以更新一个学生姓名的例子来演示。假设我们有一个包含学生信息的Student类,Student类包含属性Name、Age,我们将创建一个包含10个学生的List,将每个学生的姓名修改为“学生1”、“学生2”、……、“学生10”,使用如下代码实现:

public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
}

List students = new List
   ();
for (int i = 0; i < 10; i++)
{
    students.Add(new Student { Name = $"学生{i + 1}", Age = 20 });
}

students.ForEach(student => student.Name = student.Name + "修改后");

   
  

最后遍历输出所有学生的姓名,可以看到每个学生的姓名都被修改了:

students.ForEach(student => Console.WriteLine(student.Name));

输出的结果为:

学生1修改后
学生2修改后
学生3修改后
学生4修改后
学生5修改后
学生6修改后
学生7修改后
学生8修改后
学生9修改后
学生10修改后

六、CCTV5在线直播

c# List.ForEach方法的使用需要注意一些细节,例如在Lambda表达式中使用外部变量时,需要特别小心,以免造成错误。以下是一个使用List.ForEach方法错误的例子:

int[] nums = { 1, 2, 3, 4, 5 };
List strList = new List
   ();
nums.ToList().ForEach(num => strList.Add(num.ToString()));

   
  

这段代码期望将nums数组的所有元素转为字符串,添加到strList中,但实际上strList没有发生任何变化。

这是因为,在ForEach中使用Lambda表达式时,我们传入的是一个委托,而委托调用时每次都会重新创建一个上下文,这意味所有外部变量都是新的。因此,在ForEach循环内部修改闭包变量是无效的,我们需要在Lambda表达式外部声明一个变量,进行正确的操作。

以下是代码的正确实现:

int[] nums = { 1, 2, 3, 4, 5 };
List strList = new List
   ();
int index = 0;  // 声明外部变量
nums.ToList().ForEach(num => 
{
    strList.Add(num.ToString());
    index++;
});

   
  

这里使用了一个额外的变量index来记录操作次数,从而避免了在Lambda表达式中修改闭包变量。

七、C1驾照能开什么车

总结,c# List.ForEach方法是一个非常方便、高效的遍历List的方法,在处理List集合时可以大大简化代码量,在实际编程中非常实用。

以下是本文中示例代码的完整代码:

using System;
using System.Collections.Generic;
using System.Linq;

namespace CSharpForEach
{
    class Program
    {
        static void Main(string[] args)
        {
            // 示例一:遍历List
            List
    nums = new List
     { 1, 2, 3 };
            nums.ForEach(num => Console.WriteLine(num));

            // 示例二:遍历List
     ,输出赛程信息
            List
       matches = new List
       
        { new Match { Date = new DateTime(2022, 01, 01, 12, 0, 0), Location = "张家港市体育馆" }, new Match { Date = new DateTime(2022, 01, 03, 10, 0, 0), Location = "前卫体育中心" }, new Match { Date = new DateTime(2022, 01, 05, 14, 0, 0), Location = "沃德体育馆" } }; matches.ForEach(match => Console.WriteLine($"时间:{match.Date},地点:{match.Location}")); // 示例三:遍历嵌套的列表 List
        
         players = new List
         
          { new Player { Name = "玩家1", Scores = new List
          
           { 98, 80, 88 } }, new Player { Name = "玩家2", Scores = new List
           
            { 90, 91, 89 } }, new Player { Name = "玩家3", Scores = new List
            
             { 81, 79, 83 } } }; players.ForEach(player => { Console.Write($"玩家:{player.Name},成绩:"); player.Scores.ForEach(score => Console.Write($"{score} ")); Console.WriteLine(); }); // 示例四:结合LINQ快速查询CCTV5节目表 List<(DateTime Start, DateTime End, string Program)> programList = new List<(DateTime, DateTime, string)> { (new DateTime(2022, 1, 1, 8, 00, 0), new DateTime(2022, 1, 1, 10, 0, 0), "体育节目1"), (new DateTime(2022, 1, 1, 10, 00, 0), new DateTime(2022, 1, 1, 12, 0, 0), "NBA直播"), (new DateTime(2022, 1, 2, 10, 00, 0), new DateTime(2022, 1, 2, 12, 0, 0), "NBA直播"), (new DateTime(2022, 1, 2, 12, 30, 0), new DateTime(2022, 1, 2, 14, 0, 0), "体育节目2") }; programList.OrderBy(p => p.Start) .Where(p => p.Start.Year == 2022 && p.Start.Month == 1 && p.Start.Day == 1) .ToList() .ForEach(p => Console.WriteLine($"{p.Start.ToString("HH:mm")} - {p.End.ToString("HH:mm")}:{p.Program}")); // 示例五:批量修改List中的数据 List
             
              students = new List
              
               (); for (int i = 0; i < 10; i++) { students.Add(new Student { Name = $"学生{i + 1}", Age = 20 }); } students.ForEach(student => student.Name = student.Name + "修改后"); students.ForEach(student => Console.WriteLine(student.Name)); // 示例