質問
現在の要素のキーを取得するにはどうすればよいですか foreach
C#でループ?
例えば:
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
}
}
解決
グラウエンヴォルフのやり方 これは、配列を使用してこれを行う最も簡単でパフォーマンスの高い方法です。
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 内の要素。これだけで十分な場合は過剰ですが、大量のコレクション処理を行う場合には便利です。
他のヒント
鍵を入手したい場合は(以下を読んでください:インデックス)の場合は、for ループを使用する必要があります。実際にキー/値を保持するコレクションが必要な場合は、HashTable または Dictionary (ジェネリックを使用したい場合) の使用を検討します。
Dictionary<int, string> items = new Dictionary<int, string>();
foreach (int key in items.Keys)
{
Console.WriteLine("Key: {0} has value: {1}", key, items[key]);
}
それが役立つことを願っています、タイラー
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);
}
残念ながら、これを行う組み込みの方法はありません。for ループを使用するか、パスごとに増加する一時変数を作成します。
私はこの質問の別のバージョンでこれに答えました:
Foreachは、ienumerableを実装するコレクションを繰り返すためです。これは、コレクションのgetEnumeratorを呼び出し、列挙器を返します。
この列挙者には、メソッドとプロパティがあります。
* MoveNext() * Current
現在、列挙器が現在オンになっているオブジェクトを返し、movenextは次のオブジェクトに現在更新されます。
明らかに、インデックスの概念は列挙の概念とは異なり、行うことはできません。
そのため、ほとんどのコレクションは、インデクサーとforループコンストラクトを使用して横断することができます。
ローカル変数を使用してインデックスを追跡するのと比較して、この状況ではループを使用することを大いに好む。
実際、配列をループしたい場合は、古典的な for (;;) ループを使用する必要があります。ただし、PHP コードで実現したのと同様の機能は、次のように Dictionary を使用して 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);
}
拡張メソッドを使用して、この機能を自分で実装できます。たとえば、リストを操作する拡張メソッド 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]);
}
}
この問題に対して私が思いついた解決策は次のとおりです
元のコード:
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;
}
myKey = Array.IndexOf(values, val);