Avatar ·

Qual é a diferença entre programação declarativa e imperativa em C#?

Olá a todos! Sou um desenvolvedor C# iniciante e estou constantemente confuso com os termos "programação imperativa" e "declarativa". Li vários artigos, mas não entendi completamente a diferença na prática. Por exemplo, escrevo este código para filtrar uma lista de números:
List<int> numbers = new List<int>() { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
List<int> evenNumbers = new List<int>();

for (int i = 0; i < numbers.Count; i++)
{
    if (numbers[i] % 2 == 0)
    {
        evenNumbers.Add(numbers[i]);
    }
}
Esta é uma abordagem imperativa, certo? Eu descrevo explicitamente COMO fazer: crio um loop, verifico a condição, adiciono à lista. Mas depois vejo outra forma:
var evenNumbers = numbers.Where(n => n % 2 == 0).ToList();
Isso já é declarativo? Eu apenas digo O QUE quero obter (números pares), e não como exatamente fazer isso. Mas não tenho certeza. Qual é a principal diferença? Quando usar cada abordagem? Existem situações em que um