代码之家  ›  专栏  ›  技术社区  ›  zsharp

在上一次迭代中,如何避开foreach循环?

  •  4
  • zsharp  · 技术社区  · 15 年前
    foreach (Item i in Items)
    
     {
          do something with i;
          do another thing with i (but not if last item in collection);
     }
    
    9 回复  |  直到 15 年前
        1
  •  10
  •   Jon Skeet    15 年前

    我有一个 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
  •  24
  •   Ben M    15 年前

    最好使用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
        } 
    }
    
        3
  •  4
  •   Kamarey    15 年前
    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
  •  2
  •   jdehaan    15 年前

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

        foreach (Item i in items.Take(Items.Count - 1))
        {
    ...
        }
    
        5
  •  2
  •   John M Gant aman_novice    15 年前

    用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];
        }
    }
    
        6
  •  2
  •   Dan Tao    15 年前

    乔恩·西格尔指出:

    …当然,最后一个概念 集合中的项如果 集合未编入索引。

    也就是说,假设您想为 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
        }
    }
    
        7
  •  1
  •   tster    15 年前

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

    List<string> list = getList();
    string.Join(", ", list.ToArray());
    
        8
  •  0
  •   lincolnk    15 年前

    写这篇文章我会觉得很下流,但它可能会解决你的问题。

    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);
          }
     }
    
        9
  •  0
  •   Jaswant Agarwal    15 年前

    您可以按照按钮单击事件中的逻辑操作。

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