Foreach loop, determine which is the last iteration of the loop

前端 未结 26 894
迷失自我
迷失自我 2020-11-28 02:56

I have a foreach loop and need to execute some logic when the last item is chosen from the List, e.g.:

 foreach (Item result in Mod         


        
26条回答
  •  自闭症患者
    2020-11-28 03:08

    As Shimmy has pointed out, using Last() can be a performance problem, for instance if your collection is the live result of a LINQ expression. To prevent multiple iterations, you could use a "ForEach" extension method like this:

    var elements = new[] { "A", "B", "C" };
    elements.ForEach((element, info) => {
        if (!info.IsLast) {
            Console.WriteLine(element);
        } else {
            Console.WriteLine("Last one: " + element);
        }
    });
    

    The extension method looks like this (as an added bonus, it will also tell you the index and if you're looking at the first element):

    public static class EnumerableExtensions {
        public delegate void ElementAction(T element, ElementInfo info);
    
        public static void ForEach(this IEnumerable elements, ElementAction action) {
            using (IEnumerator enumerator = elements.GetEnumerator())
            {
                bool isFirst = true;
                bool hasNext = enumerator.MoveNext();
                int index = 0;
                while (hasNext)
                {
                    T current = enumerator.Current;
                    hasNext = enumerator.MoveNext();
                    action(current, new ElementInfo(index, isFirst, !hasNext));
                    isFirst = false;
                    index++;
                }
            }
        }
    
        public struct ElementInfo {
            public ElementInfo(int index, bool isFirst, bool isLast)
                : this() {
                Index = index;
                IsFirst = isFirst;
                IsLast = isLast;
            }
    
            public int Index { get; private set; }
            public bool IsFirst { get; private set; }
            public bool IsLast { get; private set; }
        }
    }
    

提交回复
热议问题