如何在C#中比较foreach循环中的顺序元素

zet*_*tar 0 c# foreach

在foreach循环中,我想比较一个元素与之前读取的元素.我怎样才能做到这一点?在foreach循环中寻址前一个元素的语法是什么?

谢谢!

Zoh*_*led 7

您没有使用foreach循环内置的选项.
您可以切换到for循环或使用变量.

假设您遍历对象列表,这些是您的选择:

object prev = null;
foreach(var current in myListOfObjects)
{
    if(current == prev)
    {
        // do stuff
    }

    // don't forget the next row!
    prev = current;
}
Run Code Online (Sandbox Code Playgroud)

要么

for(var i = 1; i < myListOfObjects.count, i++) // Note: starting from 1 to avoid another condition inside the loop.
{
    if(myListOfObjects[i] == myListOfObjects[i-1])
    {
        // do stuff
    }
}
Run Code Online (Sandbox Code Playgroud)


Ant*_*lev 5

蓝牙扩展方法一切都更好:

public static class EnumerableExtensions
{
    public struct CurrentAndPrevious<T>
    {
        public T Current { get; private set; }
        public T Previous { get; private set; }

        public CurrentAndPrevious(T current, T previous) : this()
        {
            Previous = previous;
            Current = current;
        }
    }

    public static IEnumerable<CurrentAndPrevious<T>> WithPrevious<T>(this IEnumerable<T> enumerable)
    {
        var previous = default(T);

        using(var enumerator = enumerable.GetEnumerator())
        {
            while(enumerator.MoveNext())
            {
                yield return new CurrentAndPrevious<T>(enumerator.Current, previous);
                previous = enumerator.Current;
            }
        }
    }
}

var items = new[] { 1, 2, 3, 4, 5 };
foreach(var item in items.WithPrevious())
{
    Console.WriteLine(item.Previous + " " + item.Current);
}
Run Code Online (Sandbox Code Playgroud)

您可能需要根据您希望处理第一个和最后一个元素的方式来调整它.

  • 虽然我喜欢这个解决方案,但我讨厌在这里使用`Tuple`.它是如此不直观的`Item1`和`Item2`.为了声明一个具有"Current"和"Previous"属性的结构...我个人会这样做. (3认同)