ホームページ  >  記事  >  バックエンド開発  >  C# での foreach トラバーサルの使用についての深い理解

C# での foreach トラバーサルの使用についての深い理解

黄舟
黄舟オリジナル
2017-08-08 10:50:483754ブラウズ

C# で foreach を使用してリストを走査することは頻繁に使用される方法であり、これも便利です。次の記事では、まず C# で foreach を使用する方法を紹介し、次に foreach を使用する際の注意点をいくつか紹介します。 C# の記事では、サンプル コードを通じて C# について詳しく紹介しています。必要な方は、以下を参照してください。

はじめに

この記事では、主に C# での foreach トラバーサルの使用法と、C# での foreach の使用について知っておくべきいくつかのことを紹介します。これは、参考と学習のために共有されています。以下で詳しく見てみましょう:

1. C# での foreach トラバーサルの使用法

foreach ループは、コレクション内のすべての要素をリストするために使用されます。foreach ステートメント内の式は、分離された 2 つの項目で構成されます。というキーワードで。 in の右側の項目はコレクション名、in の左側の項目は変数名で、コレクション内の各要素を格納するために使用されます。

このループの演算プロセスは次のとおりです。ループするたびに、集合から新しい要素値が取り出されます。これを読み取り専用変数に入れます。括弧内の式全体が true を返す場合、foreach ブロック内のステートメントを実行できます。コレクション内のすべての要素にアクセスし、式全体が false と評価されると、制御は foreach ブロックに続く実行ステートメントに流れます。

foreach ステートメントは配列とともによく使用されます。次の例では、foreach ステートメントを通じて配列の値を読み取り、それを表示します。

配列の属性: Array.Length 配列の容量

この属性を使用すると、配列オブジェクトが保存できる容量の値、つまり配列の長さと数を取得できます。これは理解しやすいものであり、配列には他にも配列の次元などの属性があります。属性の使用法は 1 つ覚えてしまえば、基本的に同じです。ここでは例を挙げません。

配列の次元と容量が大きい場合、C# はコレクション/配列内のすべての要素を読み取るために特別に使用される foreach ステートメントを提供します。これを関数トラバーサルと呼びます。構文は次のように記述されます:

配列を走査: foreach (type objName in collection/Array)

このステートメントは、配列に格納されている変数値を 1 つずつチェックし、それらを 1 つずつ取り出します。 1 つは型です。読み込む配列オブジェクトのデータ型は objName 変数に格納され、objName はコレクションと配列 (コレクション/配列) から取得される各要素を表す型の変数名を定義します。 Collection/Array は、アクセスされる配列オブジェクトです。このメソッドを使用すると、ギザギザ配列を除くすべての次元の配列を走査するために foreach を記述するだけで済みます。

注: objName のデータ型は、コレクション/Array オブジェクトの型以上である必要があります。

以下に、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 ループを使用して配列を一度に走査します


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

これら 2 つのコードの実行結果は同じで、行ごとに 1 つの要素、合計 8 行になります。要素は 1 2 3 4 5 6 7 8 です

別の例を見てみましょう。これは、for ループと foreach ループを使用して配列要素にアクセスする例です。最初に、ユーザーは生徒の数を入力するように求められ、次に生徒の数を入力します。生徒の名前を格納する配列として使用されます。名前の要素の数については、配列のインデックス i に従って、プロンプト「生徒名を入力してください」を 0 からループアウトし、put します。配列内のインデックスに従ってユーザーが入力した生徒名names[i]存储在names数组中,for循环次数的最大值(即索引的最大值)通过数组属性.Length得到,我们说过容量与索引之间的关系是index=Array.Length-1、この質問は i の最大値です

次のことに注意してください: foreach では、配列 1 の要素のみを取得できますまた、このステートメントを使用して配列に格納されている要素を変更することはできません。



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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。