遍历数组和集合可以用增强for语句来实现

本文介绍了一种在Java中使用增强for循环遍历数组和集合的方法。通过实例展示了如何使用这种新式的循环方式简化代码,提高可读性。适用于初学者了解基本的循环优化技巧。
 

数组和集合可以用for增强来遍历:

 

              int[] arr = { 1, 2, 3, 4, 5 };

 

              // 旧式方式

              for (int i = 0; i < arr.length; i++)

              {

                     System.out.println(arr[i]);

              }

 

              System.out.println("--------------------------");

 

              // 新式方式,增强的for循环

 

              for (int element : arr)

              {

                     System.out.println(element);

              }

 

              System.out.println("--------------------------");

 

              String[] names = { "hello", "world", "welcome" };

 

              for (String name : names)

              {

                     System.out.println(name);

              }

 

              System.out.println("--------------------------");

 

              int[][] arr2 = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 } };

             

              for(int[] row : arr2)

              {

                     for(int element : row)

                     {

                            System.out.println(element);

                     }

              }

             

              System.out.println("--------------------------");

             

              Collection<String> col = new ArrayList<String>();

             

              col.add("one");

              col.add("two");

              col.add("three");

             

              for(String str : col)

              {

                     System.out.println(str);

              }

             

 

<think>在C#中,除了使用`foreach`循环遍历集合数组外,还有其他多种方法可以实现遍历。以下是一些常见的方法: 1. **使用传统的`for`循环**:当集合是索引可访问的(如数组、`List<T>`等)时,可以使用`for`循环通过索引访问每个元素。 2. **使用`while`循环**:通过手动控制索引或使用枚举器(`IEnumerator`)来实现遍历。 3. **使用`List<T>`的`ForEach`方法**:`List<T>`类提供了一个`ForEach`方法,可以对每个元素执行指定的操作。 4. **使用LINQ的`ForEach`方法**:虽然LINQ主要是用于查询,但可以对`List<T>`使用`ForEach`(注意:`ForEach`不是LINQ标准查询操作符,而是`List<T>`的方法)。对于其他集合,可以先转换为列表,或者使用`foreach`循环。 5. **使用`IEnumerator`接口**:通过显式获取集合的枚举器,然后使用`MoveNext`方法`Current`属性来遍历。 6. **使用`Parallel.ForEach`**:在`System.Threading.Tasks`命名空间中,可以使用并行循环来遍历集合(适用于需要并行处理的场景)。 下面我将分别展示这些方法的代码示例。 ### 1. 使用`for`循环遍历 ```csharp int[] array = { 1, 2, 3, 4, 5 }; for (int i = 0; i < array.Length; i++) { Console.WriteLine(array[i]); } // 或者使用List<T> List<int> list = new List<int> { 1, 2, 3, 4, 5 }; for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); } ``` 这种方法适用于实现了`IList`或`IList<T>`接口的集合,这些集合可以通过索引访问。 ### 2. 使用`while`循环`IEnumerator` ```csharp List<int> list = new List<int> { 1, 2, 3, 4, 5 }; IEnumerator<int> enumerator = list.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); } // 别忘了在不需要时释放枚举器(如果枚举器实现了IDisposable) enumerator.Dispose(); ``` ### 3. 使用`List<T>.ForEach`方法 ```csharp List<int> list = new List<int> { 1, 2, 3, 4, 5 }; list.ForEach(item => Console.WriteLine(item)); ``` 注意:这个方法只适用于`List<T>`类型,不适用于其他集合类型(如数组、`IEnumerable<T>`等)。对于数组,可以将其转换为列表:`array.ToList().ForEach(...)`,但这样会创建一个新的列表,有性能开销。 ### 4. 使用`Array.ForEach`静态方法 对于数组,可以使用`Array.ForEach`静态方法: ```csharp int[] array = { 1, 2, 3, 4, 5 }; Array.ForEach(array, item => Console.WriteLine(item)); ``` ### 5. 使用`Parallel.ForEach`进行并行遍历 ```csharp using System.Threading.Tasks; List<int> list = new List<int> { 1, 2, 3, 4, 5 }; Parallel.ForEach(list, item => { Console.WriteLine(item); }); ``` 注意:并行循环中,元素的处理顺序是不确定的,且每个元素可能在不同的线程中处理。因此,如果操作有副作用(如修改共享状态),需要确保线程安全。 ### 6. 使用LINQ的`Select`方法(虽然不直接遍历,但可以执行操作) 严格来说,LINQ的`Select`是用于投影,但可以通过结合`ToList()`或`Count()`等强制立即执行的方法来触发操作,但通常不推荐仅为了副作用使用LINQ。例如: ```csharp list.Select(item => { Console.WriteLine(item); return item; }).ToList(); // 通过调用ToList()来强制执行 ``` 但这种方法通常不被推荐,因为LINQ主要用于查询,而不是执行副作用操作。 ### 总结 - 对于数组列表,可以使用`for`循环(按索引访问)或`foreach`循环。 - 对于任何实现了`IEnumerable`或`IEnumerable<T>`的集合,都可以使用`foreach`循环或通过`IEnumerator`手动遍历。 - 对于`List<T>`,可以使用其`ForEach`方法。 - 对于数组,可以使用`Array.ForEach`静态方法。 - 如果需要并行处理,可以使用`Parallel.ForEach`。 ### 注意事项 - 在遍历过程中,如果集合被修改(添加或删除元素),可能会抛出`InvalidOperationException`异常(使用`foreach`时)。 - 使用`for`循环时,如果集合不是基于索引的(如`LinkedList<T>`),则无法使用。 - 使用`IEnumerator`手动遍历时,需要记得在遍历结束后释放资源(如果枚举器实现了`IDisposable`)。 ### 代码示例:各种遍历方式 下面是一个综合示例,展示不同的遍历方法: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; class Program { static void Main() { int[] array = { 1, 2, 3, 4, 5 }; List<int> list = new List<int> { 1, 2, 3, 4, 5 }; Console.WriteLine("Using for loop with array:"); for (int i = 0; i < array.Length; i++) { Console.WriteLine(array[i]); } Console.WriteLine("\nUsing for loop with list:"); for (int i = 0; i < list.Count; i++) { Console.WriteLine(list[i]); } Console.WriteLine("\nUsing while loop with IEnumerator:"); IEnumerator<int> enumerator = list.GetEnumerator(); while (enumerator.MoveNext()) { Console.WriteLine(enumerator.Current); } enumerator.Dispose(); Console.WriteLine("\nUsing List<T>.ForEach:"); list.ForEach(item => Console.WriteLine(item)); Console.WriteLine("\nUsing Array.ForEach:"); Array.ForEach(array, item => Console.WriteLine(item)); Console.WriteLine("\nUsing Parallel.ForEach:"); Parallel.ForEach(list, item => Console.WriteLine(item)); } } ``` ### §§相关问题§§: 1. 在C#中,使用`foreach`遍历集合时,如果集合被修改会抛出什么异常?如何避免? 2. `IEnumerable``IEnumerator`接口有什么区别?请分别说明它们的用途。 3. 在C#中,如何为自定义集合实现`foreach`遍历支持? 4. 使用`Parallel.ForEach`进行并行遍历时,有哪些需要注意的线程安全问题?</think>### C#中遍历集合数组的多种方法 除了`foreach`循环,C#提供了多种遍历集合数组的方法。以下是详细的实现方案: #### 1. 使用传统的`for`循环(适用于索引可访问的集合) ```csharp int[] numbers = { 1, 2, 3, 4, 5 }; // 遍历数组 for (int i = 0; i < numbers.Length; i++) { Console.WriteLine($"Index: {i}, Value: {numbers[i]}"); } // 遍历List<T> List<string> names = new List<string> { "Alice", "Bob", "Charlie" }; for (int i = 0; i < names.Count; i++) { Console.WriteLine($"Index: {i}, Name: {names[i]}"); } ``` **解释**: - 通过索引直接访问元素 - 适用于数组、`List<T>`等支持索引器的集合 - 可以访问当前索引位置 - 不能在遍历过程中修改集合大小 #### 2. 使用`List<T>.ForEach`方法(LINQ风格) ```csharp List<int> numbers = new List<int> { 1, 2, 3, 4, 5 }; // 使用Lambda表达式 numbers.ForEach(num => Console.WriteLine(num * 2)); // 使用方法 numbers.ForEach(Console.WriteLine); ``` **解释**: - `List<T>`特有的方法 - 接受`Action<T>`委托作为参数 - 简洁的Lambda表达式语法 - 不能用于数组(需先转换为列表) #### 3. 使用`Array.ForEach`静态方法(专用于数组) ```csharp string[] colors = { "Red", "Green", "Blue" }; Array.ForEach(colors, color => { Console.WriteLine($"Color: {color.ToUpper()}"); }); ``` **解释**: - `Array`类的静态方法 - 第一个参数是目标数组,第二个是`Action<T>`委托 - 直接支持数组,无需转换 - 不能用于其他集合类型 #### 4. 使用`IEnumerator`手动遍历(底层实现) ```csharp HashSet<double> temperatures = new HashSet<double> { 20.5, 22.1, 18.7 }; using (IEnumerator<double> enumerator = temperatures.GetEnumerator()) { while (enumerator.MoveNext()) { Console.WriteLine($"Temperature: {enumerator.Current}°C"); } } ``` **解释**: - 直接使用`IEnumerator`接口 - `MoveNext()`前进到下一元素 - `Current`获取当前元素 - 需要手动处理资源(使用`using`语句) - 支持所有实现`IEnumerable`的集合 #### 5. 使用`Parallel.ForEach`并行遍历(高性能场景) ```csharp using System.Threading.Tasks; List<int> bigData = Enumerable.Range(1, 1000000).ToList(); Parallel.ForEach(bigData, number => { // 注意:并行操作需线程安全 if (number % 100000 == 0) Console.WriteLine($"Found: {number}"); }); ``` **解释**: - 来自`System.Threading.Tasks`命名空间 - 自动分割集合进行并行处理 - 适用于CPU密集型操作 - 执行顺序不确定 - 需要处理线程安全问题 #### 6. 使用LINQ的`Select`方法(函数式风格) ```csharp var words = new[] { "apple", "banana", "cherry" }; // 遍历并转换元素 var upperWords = words.Select(w => { Console.WriteLine($"Processing: {w}"); return w.ToUpper(); }).ToList(); // 需要执行操作(如ToLlist)才会实际遍历 ``` **解释**: - 延迟执行(需要终端操作触发) - 可以同时转换遍历元素 - 返回新的`IEnumerable`序列 - 适用于数据转换管道 ### 方法选择建议: 1. 需要索引 → `for`循环 2. 简洁语法 → `List.ForEach`/`Array.ForEach` 3. 底层控制 → `IEnumerator` 4. 大数据处理 → `Parallel.ForEach` 5. 数据转换 → LINQ `Select`
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值