2011-01-17 3 views
7

Можно создать дубликат:
Foreach loop, determine which is the last iteration of the loopC# как получить последний раз в заявлении foreach?

foreach (DataRowView row in orderedTable.DefaultView) 
{ 
    if(lasttime) do-something; 
} 

orderedtable является DataTable

Кто-нибудь знает, как узнать, есть ли у нас на последнюю итерации? пожалуйста, имейте в виду, что у меня есть дубликаты в упорядоченных таблицах

+0

Что такое 'lasttime'? Что ты имеешь в виду? – Oded

+0

Последняя итерация foreach –

+0

Существует хорошее объяснение, почему этого не может быть сделано здесь: http://stackoverflow.com/questions/43021/c-get-index-of-current-foreach-iteration –

ответ

7

foreach конструкция не знает такую ​​вещь, так как это в равной степени относится к неограниченным спискам. Он просто не знает, что такое последнее вещь.

Вы можете перебирать вручную, как хорошо, хотя:

for (int i = 0; i < orderedTable.DefaultView.Count; i++) { 
    DataRowView row = orderedTable.DefaultView[i]; 
    if (i == orderedTable.DefaulView.Count - 1) { 
     // dosomething 
    } 
} 
+0

(Перекрестите пальцы и надейтесь, что свойство 'Count' существует и не медленно ...) – Mehrdad

+0

Ну, MSDN перечисляет его. Я не искал, может ли он быть необязательным или нет (на самом деле вещь с дополнительными методами - это то, что я знаю только с Java). – Joey

2

Вам нужно будет использовать обычный цикл цикла, если вы хотите иметь другое поведение в последнем элементе.

for (int i = 0; i < orderedTable.DefaultView.Count; i++) 
{ 
    //do stuff 
    if (i == orderedTable.DefaultView.Count - 1) 
    { 
     //do additional special stuff 
    } 
} 

Стоит отметить, что «другие тарелочки» имеет реализацию «умные перечислимы», который поддерживает последнее свойство. Смотрите статью здесь: http://msmvps.com/blogs/jon_skeet/archive/2007/07/27/smart-enumerations.aspx

С этим вы могли бы написать что-то вроде этого (я мог бы получить детали неправильно, не пробовал это сам):

foreach (SmartEnumerable<DataRowView> item in new SmartEnumerable<DataRowView>(orderedTable.DefaultView)) 
{ 
    DataRowView row = item.Value; 
    if(item.IsLast) 
    { 
     ///do special stuff 
    } 
} 
+0

может показать мне, пожалуйста, –

0

Если вы беспокоитесь в отслеживании вашей итерации, почему бы не использовать for вместо или foreach? Тогда вы можете просто сделать следующее:

for(int i = 0; i<orderedTable.DefaultView.Count-1;i++) 
{ 
    if(i==orderedTable.DefaultView.Count-1) 
    { 
     // Last Row 
    } 
} 
0

Вместо того, чтобы использовать Еогеасп получить IEnumerator. Если MoveNext возвращает null, предыдущий был последним.

для работа тоже конечно.

16

правильно метод, который работает в все случаях является использование IEnumerator<T> непосредственно:

using (var enumerator = orderedTable.DefaultView.GetEnumerator()) 
{ 
    if (enumerator.MoveNext()) 
    { 
     bool isLast; 
     do 
     { 
      var current = enumerator.Current; 
      isLast = !enumerator.MoveNext(); 
      //Do stuff here 
     } while (!isLast); 
    } 
} 

Этот метод работает, даже если ваша коллекция не имеет Count свойства, и даже если он делает , этот метод будет более эффективным, если свойство Count будет медленным.

0

Вы могли бы сделать что-то вроде следующего:

foreach (DataRowView row in orderedTable.DefaultView) 
{ 
    if(row == orderedTable.DefaultView.Last()) do-something; 
} 

Но его довольно неэффективно.

3

Альтернативный подход, который я не думаю, что кто-то разместил. Это хорошо работает, если вы не знаете счет заранее.

DataRowView lastRow; 
foreach (DataRowView row in orderedTable.DefaultView) 
{ 
    // Do something... 

    lastRow = row; 
} 

if (lastRow != null) 
{ 
    // Do something with last row 
} 
+0

Этот метод потенциально требует дублирования кода, который нам всем нравится избегать ... – Mehrdad

+1

@Lambert: Каждая строка, включая последнюю, запускает основной блок кода, поэтому дублирования нет. Я полагаю, что этот способ не сработает, если вы * не хотите «// делать что-то ...» в последней строке, так как он позволяет вам одновременно запускать код в последней строке * * ряд строк. –

0

Код, который вы выложили идентичен:

if (orderedTable.DefaultView.Rows.Count > 0) 
    do-something; 

Если это не делать то, что вы хотите, вы должны объяснить, что lastTime делает.

0

Если я понимаю ваш вопрос, помогает ли это?

int lastrow = 0; 
foreach (DataRow row in table.Rows) // Loop over the rows. 
{ 
    lastrow++; 
    // Do Something 
    if (lastrow == (table.Rows.Count - 1)) 
    { 
     // Do something else 
    } 
} 
+0

будет лучше как цикл for, потому что для уже введена локальная переменная, но она работает. – caesay

Смежные вопросы