web-dev-qa-db-ja.com

foreachで反復しているときに、行インデックスを知るにはどうすればよいですか?

次の例では、現在の行インデックスをどのように知ることができますか?

foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
}
9
Luiscencio

MiscUtil にタイプがあります。これはこれに役立ちます--SmartEnumerable。これはばかげた名前ですが、機能します:)詳細については 使用ページ を参照してください。C#3を使用している場合は、さらに簡単にすることができます。

foreach (var item in temptable.Rows.AsSmartEnumerable())
{
    int index = item.Index;
    DataRow value = item.Value;
    bool isFirst = item.IsFirst;
    bool isLast = item.IsLast;
}
17
Jon Skeet

自分で作成する必要があります

var i = 0;
foreach (DataRow temprow in temptable.Rows)
{
    this.text = i;
    // etc
    i++;
}

または、代わりにforループを実行することもできます。

23
Joseph

Linqを使用できる場合は、次のように実行できます。

foreach (var pair in temptable.Rows.Cast<DataRow>()
                                   .Select((r, i) => new {Row = r, Index = i}))
{
    int index = pair.Index;
    DataRow row = pair.Row;
}
14
adrianbanks

あなたは実際にはしません。 foreachの優れた点の1つは、増分を処理して長さをチェックする追加のコードセットがないことです。

独自のインデックスが必要な場合は、次のようなことを行う必要があります

int rowindex = 0;
foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
    this.text = rowindex++;
}
6
Filip Ekberg
int rowIndex = temptable.Rows.IndexOf(temprow);
4
Nick DeVore

遅くなるよりはまし...

foreach (DataRow temprow in temptable.Rows)
{
    temptable.Rows.IndexOf(temprow);
}
1
Carpentweet

任意のセル番号を書き込み、RowIndexを取得します


foreach (var item in datagridview.Rows)
   {
     //TextBox1.Text= item.Cells[0].RowIndex.ToString();
   }
1
Mehmet Ali

標準のforeachループでは不可能です。最も簡単な方法は、forループを使用することです

for ( int i = 0; i < temptable.Rows.Count; i++ ) {
  DataRow temprow = (DataRow)temptable.Rows[i];
  ...
}

別のオプションは、拡張メソッドを使用することです

public static void ForEachIndex<T>(this IEnumerable<T> e, Action<T,int> del) {
  var i = 0; 
  foreach ( var cur in e ) {
    del(cur,i);
  }
}

.。

temptable.Rows.Cast<DataRow>.ForEachIndex((cur,index) 
{
  ...
});
1
JaredPar

ねえ、私が思うはるかに速い方法があります。繰り返しは必要ありません!まず、DataRowのFriendRowIDフィールドの静的変数を宣言します。

Private Shared RowIDFieldInfo As System.Reflection.FieldInfo = GetType(DataRow).GetField("_rowID", System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance)

次に、それを使用するために必要なのは次のとおりです。

RowIDFieldInfo.GetValue(MyDataRow) - 1

リゾーティングまたはフィルタリングした後、これをテストしていません。私の場合、それを行う必要はないので、これは機能します。

1
toddmo

Forループを使用するか、整数のフォローを使用します。

int count =0;
foreach (DataRow temprow in temptable.Rows)
{
    //count is the index of the row in the array temptable.Rows
    //this.text = temprow.INDEX????
    ++count;
}
0
Erich

標準のforループを使用してインデックスを取得できます

for(int i=0; i<temptable.Rows.Count; i++)
{
   var index = i;
   var row = temptable.Rows[i];
}
0
bendewey

LFSRの答えは正しいですが、ほぼすべてのコレクション/リストで.IndexOfを呼び出すと、一致する行が見つかるまでリストが列挙されると確信しています。大規模なDataTableの場合、これは遅くなる可能性があります。

テーブル上で(i = 0; i <temptable.Rows.Count; i ++){...}を実行する方がよい場合があります。そうすれば、インデックス検索税を課すことなくインデックスを取得できます。

0
Yoopergeek

列名を使用する代わりにインデックスを使用してデータを取得する別の方法

foreach (DataRow temprow in temptable.Rows)
{
    String col1 = temprow[0].ToString().Trim();
    String col2 = temprow[1].ToString().Trim();
}

お役に立てば幸いです

0
Wei Chun