28

foreachC#のループで現在の要素のキーを取得するにはどうすればよいですか?

例えば:

PHP

foreach ($array as $key => $value)
{
    echo("$value is assigned to key: $key");
}

私がC#でやろうとしていること:

int[] values = { 5, 14, 29, 49, 99, 150, 999 };

foreach (int val in values)
{
    if(search <= val && !stop)
    {
         // Set key to a variable
    }
}
4

9 に答える 9

24

Grauenwolf の方法は、配列でこれを行う最も簡単でパフォーマンスの高い方法です。

for ループを使用するか、パスごとにインクリメントする一時変数を作成します。

もちろん、これは次のようになります。

int[] values = { 5, 14, 29, 49, 99, 150, 999 };

for (int key = 0; key < values.Length; ++key)
  if (search <= values[key] && !stop)
  {
    // set key to a variable
  }

.NET 3.5 では、より機能的なアプローチもとることができますが、サイトではもう少し冗長であり、IEnumerable の要素にアクセスするためにいくつかのサポート関数に依存する可能性ありますこれだけで十分な場合はやり過ぎですが、多くのコレクション処理を行う傾向がある場合は便利です。

于 2008-09-12T22:34:50.860 に答える
23

キー (読み取り: インデックス) を取得したい場合は、for ループを使用する必要があります。実際にキー/値を保持するコレクションが必要な場合は、HashTable または Dictionary を使用することを検討します (Generics を使用する場合)。

Dictionary<int, string> items = new  Dictionary<int, string>();

foreach (int key in items.Keys)
{
  Console.WriteLine("Key: {0} has value: {1}", key, items[key]);
}

お役に立てば幸いです、タイラー

于 2008-09-12T21:58:53.957 に答える
9

DictionaryEntry と KeyValuePair を使用する場合:

MSDNに基づく

IDictionary<string,string> openWith = new Dictionary<string,string>()
{
   { "txt", "notepad.exe" }
   { "bmp", "paint.exe" }
   { "rtf", "wordpad.exe" }
};

foreach (DictionaryEntry de in openWith)
{
    Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
}

// also

foreach (KeyValuePair<string,string> de in openWith)
{
    Console.WriteLine("Key = {0}, Value = {1}", de.Key, de.Value);
}

関連する SO の質問: KeyValuePair VS DictionaryEntry

于 2011-09-09T19:15:03.133 に答える
4

残念ながら、これを行う組み込みの方法はありません。for ループを使用するか、パスごとにインクリメントする一時変数を作成します。

于 2008-09-12T21:48:40.923 に答える
3

この質問の別のバージョンでこれに答えました:

Foreach は、IEnumerable を実装するコレクションを反復処理するためのものです。これは、Enumerator を返すコレクションで GetEnumerator を呼び出すことによって行われます。

この列挙子には、メソッドとプロパティがあります。

* MoveNext()
* Current

Current は Enumerator が現在オンになっているオブジェクトを返し、MoveNext は Current を次のオブジェクトに更新します。

明らかに、インデックスの概念は列挙の概念とは無関係であり、実行できません。

そのため、ほとんどのコレクションは、インデクサーと for ループ コンストラクトを使用してトラバースできます。

この状況では、ローカル変数でインデックスを追跡するよりも for ループを使用する方がはるかに好きです。

foreach ループの現在の反復のインデックスを取得するにはどうすればよいですか?

于 2008-09-12T22:38:31.897 に答える
2

実際には、配列をループしたい場合は、従来の for (;;) ループを使用する必要があります。しかし、PHP コードで実現した同様の機能は、辞書を使用して次のように C# で実現できます。

Dictionary<int, int> values = new Dictionary<int, int>();
values[0] = 5;
values[1] = 14;
values[2] = 29;
values[3] = 49;
// whatever...

foreach (int key in values.Keys)
{
    Console.WriteLine("{0} is assigned to key: {1}", values[key], key);
}
于 2008-09-12T21:59:59.883 に答える
0

これが、この問題に対して私が思いついた解決策です

元のコード:

int index=0;
foreach (var item in enumerable)
{
    blah(item, index); // some code that depends on the index
    index++;
}

更新されたコード

enumerable.ForEach((item, index) => blah(item, index));

延長方法:

    public static IEnumerable<T> ForEach<T>(this IEnumerable<T> enumerable, Action<T, int> action)
    {
        var unit = new Unit(); // unit is a new type from the reactive framework (http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx) to represent a void, since in C# you can't return a void
        enumerable.Select((item, i) => 
            {
                action(item, i);
                return unit;
            }).ToList();

        return pSource;
    }
于 2009-12-31T05:29:17.923 に答える
0

この機能は、拡張メソッドを使用して自分で実装できます。たとえば、リストで機能する拡張メソッド KeyValuePairs の実装を次に示します。

public struct IndexValue<T> {
    public int Index {get; private set;}
    public T Value {get; private set;}
    public IndexValue(int index, T value) : this() {
        this.Index = index;
        this.Value = value;
    }
}

public static class EnumExtension
{
    public static IEnumerable<IndexValue<T>> KeyValuePairs<T>(this IList<T> list) {
        for (int i = 0; i < list.Count; i++)
            yield return new IndexValue<T>(i, list[i]);
    }
}
于 2009-12-31T06:12:08.447 に答える
-10

myKey = Array.IndexOf(values, val);

于 2008-09-12T21:53:34.420 に答える