Just a short code snippet. Suppose you need to implement logic similar to this:

   Prod Demo QA Dev
Prod  X X X
Demo   X X
QA    X

One straightforward way would be do ifs on every input. That would be fine for short input but may become problematic if more conditions are added.

So the alternative would be to define all possible conditions in two-dimensional array which is very easy to query with LINQ:

public class EnvironmentService  
    private bool[,] _states;
    private int _size;

    public EnvironmentService()
        _size = Enum.GetNames(typeof(EnvironmentType)).Count();
        _states = new bool[_size, _size];
        _states[(int)EnvironmentType.Prod, (int)EnvironmentType.Demo] = true;
        _states[(int)EnvironmentType.Prod, (int)EnvironmentType.Qa] = true;
        _states[(int)EnvironmentType.Prod, (int)EnvironmentType.Dev] = true;
        _states[(int)EnvironmentType.Demo, (int)EnvironmentType.Qa] = true;
        _states[(int)EnvironmentType.Demo, (int)EnvironmentType.Dev] = true;
        _states[(int)EnvironmentType.Qa, (int)EnvironmentType.Dev] = true;

    public ICollection<EnvironmentType> GetSources()
        return new List<EnvironmentType>

    public ICollection<EnvironmentType> GetDesitinations(EnvironmentType source)
        return Enumerable.Range(0, _size)
            .Where(i => _states[(int)source, i])
            .Select(s => (EnvironmentType)s)