如何在上次迭代期间转义foreach循环?

时间:2009-09-30 15:13:55

标签: c# list

foreach (Item i in Items)

 {
      do something with i;
      do another thing with i (but not if last item in collection);
 }

9 个答案:

答案 0 :(得分:24)

最好使用for循环:

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
    } 
}

答案 1 :(得分:10)

我在helper class for this中有一个MiscUtil。示例代码(来自第一个链接):

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" : "");
}

如果您使用的是.NET 3.5和C#3,这样更简单,因此您可以使用扩展方法和隐式输入:

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

使用for循环的好处是,它可以与IEnumerable<T>而不是IList<T>一起使用,因此您可以将它与LINQ等一起使用,而无需缓冲所有内容。 (它会内部维护一个单项缓冲区。)

答案 2 :(得分:4)

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);
}

答案 3 :(得分:2)

for循环而不是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];
    }
}

答案 4 :(得分:2)

您可以使用LINQ(如果您使用C#-3.0):

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

答案 5 :(得分:2)

Jon Siegel指出:

  

...当然是最后一个概念   如果,集合中的项目毫无意义   该集合未编入索引。

那就是说,假设你想为IEnumerable<T>中的每个项目做一些事情,除了一个,其中一个是枚举者任意访问的最后一个。细:

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
    }
}

答案 6 :(得分:1)

看起来这就是你想要解决的问题。

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

答案 7 :(得分:0)

我觉得写这个很脏,但它可能会解决你的问题。

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);
      }
 }

答案 8 :(得分:0)

您可以像按钮点击事件一样遵循此逻辑。

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);
                }
            }
        }


    }
}