Равенство действительно является специальным видом отношения эквивалентности на самом деле. Рассмотрите то, что это означает говорить:
0.9999999999999999... = 1
, Который предполагает, что равенство является просто отношением эквивалентности на "строковых числах" (которые определяются более официально как функции от Z-> {0..., 9}). И мы видим от этого случая, классы эквивалентности даже не являются одиночными элементами.
У меня есть тип в 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;
}
Вы должны создать его сами
var i = 0;
foreach (DataRow temprow in temptable.Rows)
{
this.text = i;
// etc
i++;
}
или вместо этого можете просто выполнить цикл for.
Если вы можете использовать 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;
}
На самом деле вы этого не делаете. Одно из достоинств foreach заключается в том, что у вас нет дополнительного набора обработки кода, увеличивающего и проверяющего длину.
Если вы хотите иметь свой собственный Индекс, вам придется сделать что-то вроде этого
int rowindex = 0;
foreach (DataRow temprow in temptable.Rows)
{
//this.text = temprow.INDEX????
this.text = rowindex++;
}
Это невозможно со стандартным циклом 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)
{
...
});
Либо используйте цикл 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;
}
Вы можете использовать стандарт для
] для получения индекса
for(int i=0; i<temptable.Rows.Count; i++)
{
var index = i;
var row = temptable.Rows[i];
}
Хотя ответ LFSR правильный, я почти уверен, что вызов .IndexOf практически для любой коллекции / списка будет перечислять список до тех пор, пока не найдет соответствующую строку. Для больших DataTable это может быть медленным.
Может быть, лучше для (i = 0; i