Validate the order of a List by custom strings
Dictionary

I'd prefer to store animal names and their "values" in a dictionary.  

private static readonly Dictionary&lt;string, int&gt; AnimalValues = new Dictionary&lt;string, int&gt;
        {
            { "Cat", 1 },
            { "Dog", 2 },
            { "Horse", 3 },
            { "Elephant", 4 }
        };


Then the validation method will look like:

public static bool IsValidAnimalOrder(IEnumerable&lt;string&gt; animalNames)
{
    int prevValue = 0;
    foreach (string animalName in animalNames)
    {
        int curValue;
        if (!AnimalValues.TryGetValue(animalName, out curValue))
        {
            // If the animal's name is absent in the dictionary.
            return false;
        }
        if (curValue &lt; prevValue)
        {
            // If the current animal's value less than the previous one.
            return false;
        }
        prevValue = curValue;
    }
    return true;
}




switch

Alternative way is to use the switch operator instead of a dictionary as follows:

public static bool IsValidAnimalOrder(IEnumerable&lt;string&gt; animalNames)
{
    int prevValue = 0;
    foreach (string animalName in animalNames)
    {
        int curValue;
        switch (animalName)
        {
            case "Cat":
                curValue = 1;
                break;
            case "Dog":
                curValue = 2;
                break;
            case "Horse":
                curValue = 3;
                break;
            case "Elephant":
                curValue = 4;
                break;
            default:
                // If the animal's name is not listed above.
                return false;
        }
        if (curValue &lt; prevValue)
        {
            // If the current animal's value less than the previous.
            return false;
        }
        prevValue = curValue;
    }
    return true;
}




IEnumerable&lt;T&gt; problem

As @Mat's Mug♦ mentioned, IEnumerable&lt;T&gt; doesn't guarantee the order of its elements. So you could change argument type to IList&lt;T&gt; or IReadOnlyList&lt;T&gt;. But this will reject another enumerations with the specified order: IOrderedEnumerable&lt;T&gt; and IOrderedQueryable&lt;T&gt;.
As a workaround you could make the method above private and declare public overloads accepting all the suitable enumeration types above as argument:

public static bool IsValidAnimalOrder(IReadOnlyList&lt;string&gt; animalNames)
{
    return IsValidAnimalOrder((IEnumerable&lt;string&gt;)animalNames);
}

public static bool IsValidAnimalOrder(IOrderedEnumerable&lt;string&gt; animalNames)
{
    return IsValidAnimalOrder((IEnumerable&lt;string&gt;)animalNames);
}

public static bool IsValidAnimalOrder(IOrderedQueryable&lt;string&gt; animalNames)
{
    return IsValidAnimalOrder((IEnumerable&lt;string&gt;)animalNames);
}