How to avoid foreach loop during the last iteration?

foreach (Item i in Items) { do something with i; do another thing with i (but not if last item in collection); } 
+4
source share
9 answers

I have a helper class for this in MiscUtil . Sample code (from the first link):

 foreach (SmartEnumerable<string>.Entry entry in new SmartEnumerable<string>(list)) { Console.WriteLine ("{0,-7} {1} ({2}) {3}", entry.IsLast ? "Last ->" : "", entry.Value, entry.Index, entry.IsFirst ? "<- First" : ""); } 

This is simpler if you use .NET 3.5 and C # 3 to use extension methods and implicit spelling:

 foreach (var entry in list.AsSmartEnumerable()) { Console.WriteLine ("{0,-7} {1} ({2}) {3}", entry.IsLast ? "Last ->" : "", entry.Value, entry.Index, entry.IsFirst ? "<- First" : ""); } 

The good thing about this using a for loop is that it works with IEnumerable<T> instead of IList<T> , so you can use it with LINQ, etc. without buffering everything. (It supports an internal single-input buffer, mind you.)

+10
source

Better use a for loop:

 int itemCount = Items.Count; for (int i = 0; i < itemCount; i++) { var item = Items[i]; // do something with item if (i != itemCount - 1) { // do another thing with item } } 
+24
source
 foreach (Item i in Items.Take(Items.Count - 1)) { do something with i; do another thing with i (but not if last item in collection); } 
+4
source

How about a for loop instead of foreach.

 for (int i = 0; i < Items.Count; i++) { //do something with i; if (i == Items.Count - 1) { //do another thing with Items[Items.count - 1]; } } 
+2
source

You can use LINQ (if you are using C # -3.0):

  foreach (Item i in items.Take(Items.Count - 1)) { ... } 
+2
source

As John Siegel noted:

... of course, the concept of the last element in a collection does not make sense if the collection is not indexed.

However, suppose you want to do something for every element in IEnumerable<T> , except for one, the one that turns out to be the last randomly visited enumerator. Fine:

 IEnumerator<Item> e = Items.GetEnumerator(); e.MoveNext(); while (e.Current != null) { Item i = e.Current; // do something with i; if e.MoveNext() { // do another thing with i } } 
+2
source

Looks like you tried to solve.

 List<string> list = getList(); string.Join(", ", list.ToArray()); 
+1
source

I would feel pretty dirty writing this, but that might solve your problem.

 Item last = null; foreach (Item i in Items) { last = i; } foreach (Item i in Items) { do something with i; if (i!=last){ do another thing with i (but not if last item in collection); } } 
0
source

You can follow this logic, as in a button click event.

 namespace LastEnumItem { public partial class Form1 : Form { List<string> lst = new List<string>(); public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { for(int i=0; i<=10 ; i++) { lst.Add("string " + i.ToString()); } } private void button1_Click(object sender, EventArgs e) { string lastitem = lst[lst.Count-1]; foreach (string str in lst) { if (lastitem != str) { // do something } else { MessageBox.Show("Last Item :" + str); } } } } } 
0
source

All Articles