Czy LINQ dokona iteracji stosu w kolejności LIFO [duplikat]

Dec 08 2020

Czy metody LINQ będą iterować zawartość stosu (iw moim konkretnym przypadku Stack ) w kolejności LIFO (Last In, First Out) (tj. W tej samej kolejności, w jakiej można uzyskać zdejmowanie każdego elementu, który jest odwrotnością kolejności w które zostały wrzucone do stosu). Ponadto, ponieważ jest wolny od efektów ubocznych, czy powstrzyma się od wyskakiwania stosu podczas iteracji?

Proste pytanie i założyłbym, że tak i tak, ale tak proste, że wyszukiwanie dało ogromne ilości odpowiedzi związanych z LINQ i stosem, z których żaden z niezliczonych wyników, które przeglądałem, nie odpowiedział konkretnie w tym przypadku.

Odpowiedzi

1 AndrewH Dec 08 2020 at 17:24

Tak.

Poniższy eksperyment pokazuje, że postępuje zgodnie z kolejnością LIFO stosu.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

public class DoesLinqIterateAStackInLifo
{
    public static void Main()
    {
        var stack = new Stack<char>();
        stack.Push('s');
        stack.Push('e');
        stack.Push('Y');
        Console.WriteLine(stack.Aggregate(new StringBuilder(), (builder,letter) => builder.Append(letter)));
        Console.WriteLine(string.Join("",stack.ToList()));      
        if(stack.Count==3) 
        {
            Console.WriteLine("And it will not pop the stack");
        }       
    }
}

Wynik:

Yes
Yes
And it will not pop the stack