>  기사  >  백엔드 개발  >  C#의 foreach 순회 사용에 대한 심층적인 이해

C#의 foreach 순회 사용에 대한 심층적인 이해

黄舟
黄舟원래의
2017-08-08 10:50:483754검색

C#에서 foreach를 통한 목록 순회는 자주 사용하는 방법이며 사용하기도 편리합니다. 다음 글에서는 먼저 C#에서 foreach 순회를 사용하는 방법을 소개한 다음, foreach를 사용할 때 주의해야 할 몇 가지 사항을 소개합니다. C# 기사에서는 샘플 코드를 통해 자세히 소개하고 있으며, 필요한 친구는 아래에서 살펴볼 수 있습니다.

머리말

이 글에서는 주로 C#의 foreach 순회 사용법과 C#의 foreach 사용에 대해 알아야 할 몇 가지 사항을 소개하며 참고 및 학습을 위해 공유합니다. 자세한 소개:

1. C#의 foreach 순회 사용법

foreach 루프는 컬렉션의 모든 요소를 ​​나열하는 데 사용됩니다. foreach 문의 표현식은 구분된 두 항목으로 구성됩니다. in이라는 키워드로 in의 오른쪽 항목은 컬렉션 이름이고, 왼쪽 항목은 컬렉션의 각 요소를 저장하는 데 사용되는 변수 이름입니다.

이 루프의 작업 프로세스는 다음과 같습니다. 루프를 돌릴 때마다 집합에서 새 요소 값을 꺼냅니다. 읽기 전용 변수에 넣습니다. 괄호 안의 전체 표현식이 true를 반환하면 foreach 블록의 문이 실행될 수 있습니다. 컬렉션의 모든 요소에 액세스하고 전체 식이 false로 평가되면 foreach 블록 다음의 실행 문으로 제어가 흐릅니다.

foreach 문은 배열과 함께 자주 사용됩니다. 다음 예에서는 foreach 문을 통해 배열의 값을 읽고 표시합니다.

배열의 속성: Array.Length 배열의 용량

이 속성을 사용하면 배열 개체가 저장할 수 있는 용량 값, 즉 배열의 길이와 개수를 얻을 수 있습니다. 이것은 이해하기 더 쉽고 배열의 크기와 같은 다른 속성도 있습니다. 속성의 사용법은 비교적 간단합니다. 일단 하나를 배우면 다른 형식은 기본적으로 동일합니다. 여기서는 예제를 제공하지 않습니다.

배열의 크기와 용량이 큰 경우 C#에서는 컬렉션/배열의 모든 요소를 ​​읽는 데 특별히 사용되는 foreach 문을 제공합니다. 이 함수를 순회라고 합니다. 구문은 다음과 같이 작성됩니다.

배열 탐색: foreach (컬렉션/배열에 objName 입력)

배열에 저장된 변수 값을 하나씩 확인하여 하나씩 꺼내는 명령문입니다. type은 읽어오려는 배열 객체의 데이터 타입이 objName 변수에 저장되며, objName은 컬렉션과 배열(컬렉션/배열)에서 얻은 각 요소를 나타내는 type type의 변수 이름을 정의합니다. 컬렉션/배열은 액세스할 배열 개체입니다. 이런 방식으로 가변 배열을 제외한 모든 차원의 배열을 탐색하려면 foreach만 작성하면 됩니다.

참고: objName의 데이터 유형은 컬렉션/배열 개체의 유형과 같거나 커야 합니다.

아래에서는 foreach 및 for를 사용하여 규칙 배열을 순회하는 예를 제공합니다. 여기에는 배열의 크기를 얻는 방법이 포함되며 규칙 배열을 한 번에 순회할 때 foreach의 장점을 비교합니다.


int[,,] a = new int[2, 2, 2] { {{ 1, 2 }, { 3,4}},{{ 5, 6 }, { 7,8}} };// 定义一个2行2列2纵深的3维数组a
for (int i = 0; i < a.GetLength (0) ;i++ ) //用Array.GetLength(n)得到数组[0,1,,,n]上的维数的元素数,0代表行,1列,n代表此数组是n+1维
{
 for (int j = 0; j < a.GetLength(1); j++)
 {
 for (int z = 0; z < a.GetLength(2);z++ )//2代表得到纵深上的元素数,如果数组有n维就得写n个for循环
 {
 Console.WriteLine(a[i,j,z]);
 }
 }
}

foreach 루프를 사용하여 a 배열을 한 번에 순회


int[,,] a = new int[2, 2, 2] { {{ 1, 2 }, { 3,4}},{{ 5, 6 }, { 7,8}} };//定义一个2行2列2纵深的3维数组a
foreach(int i in a)
{
 Console .WriteLine (i);
}

이 두 코드의 실행 결과는 동일합니다. 행당 요소가 하나씩, 총 8행이고, 요소는 1 2 3 4 5 6 7 8

for 및 foreach 루프를 사용하여 배열 요소에 액세스하는 예입니다. 먼저 사용자에게 학생 수를 입력하라는 메시지가 표시됩니다. of Students는 학생 이름을 저장하는 배열로 사용됩니다. 이름의 요소 수에 대해 for 루프를 사용하여 배열의 인덱스 i에 따라 0부터 시작하는 루프에서 "학생 이름 입력" 프롬프트를 출력합니다. , 사용자가 입력한 학생 이름은 배열의 인덱스에 따라 계산됩니다names[i]存储在names数组中,for循环次数的最大值(即索引的最大值)通过数组属性.Length得到,我们说过容量与索引之间的关系是index=Array.Length-1. 이 질문은 i의 최대값입니다.

다음에 유의해야 합니다. foreach를 사용하면 배열의 요소를 하나씩 변경해야 하며 이 문을 사용하여 배열에 저장된 요소를 변경할 수 없습니다.



using System;
class Program
{
 static void Main()
 {
 int count;
 Console.WriteLine("输入要登记的学生数");
 count = int.Parse(Console.ReadLine());
 string[]names = new string[count];
 for (int i = 0; i < names.Length; i++)
 {
 Console.WriteLine("请输入第{0}个学生的姓名", i + 1);
 names[i] = Console.ReadLine();
 }
 Console.WriteLine("已登记的学生如下");
 foreach (string name in names)
 {
 Console.WriteLine("{0}", name);
 }
 Console.ReadKey();
 }
}

2. C#에서 foreach를 사용할 때 알아야 할 사항

C#에서 foreach를 통해 목록을 순회하는 방법도 자주 사용하는 방법입니다. 와 동일한 성능은 큰 차이가 없는데 왜 주의를 기울여야 합니까? 먼저 다음 문장을 살펴보겠습니다. 할당된 메모리 양과 테스트를 완료하는 데 필요한 시간 사이에는 직접적인 관계가 있습니다. 단독으로 보면 메모리 할당 비용이 그리 비싸지 않습니다. 그러나 메모리 시스템이 사용하지 않는 메모리를 가끔씩만 정리하는 경우 문제가 발생하며, 문제의 빈도는 할당되는 메모리 양에 비례합니다. 따라서 더 많은 메모리를 할당할수록 메모리가 더 자주 가비지 수집되고 코드 성능이 저하됩니다.

从上面那些话可以看到内存的回收是非常损耗资源,那我们再看下一些.net内部类型的实现。

Array:


// System.Array

public IEnumerator GetEnumerator()

{

int lowerBound = this.GetLowerBound(0);

if (this.Rank == 1 && lowerBound == 0)

{

return new Array.SZArrayEnumerator(this);

}

return new Array.ArrayEnumerator(this, lowerBound, this.Length);

}

List8742468051c85b06f0a0af9e3e506b5c:


// System.Collections.Generic.List<T>

public List<T>.Enumerator GetEnumerator()

{

return new List<T>.Enumerator(this);

}

Dictionaryb6842da76bed01162354d37c4f2d3464:


// System.Collections.Generic.Dictionary<TKey, TValue>

public Dictionary<TKey, TValue>.Enumerator GetEnumerator()

{

return new Dictionary<TKey, TValue>.Enumerator(this, 2);

}

从以上代码来看,我们再进行foreach操作以上对象的时候都会构建一个Enumerator;也许有人会认为这点东西不需要计较,不过的确很多情况是不用关心;但如果通过内存分析到到的结果表明构建Enumerator的数量排在前几位,那就真的要关心一下了。很简单的一个应用假设你的应用要处理几W的并发,而每次都存在几次foreach那你就能计算出有多少对象的产生和回收?

看下一个简单的分析图,这里紧紧是存在一个List'1如果组件内部每个并发多几个foreach又会怎样?

改成for的结果又怎样呢


总结

위 내용은 C#의 foreach 순회 사용에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.