Random range with no repeat and efficient for small subset
Before I start, let me say that this code looks pretty good. You seem to have tested your algorithm pretty well and I've never read about shuffling algorithms other than the Fisher-Yates, so I won't comment on it.



First, this code seems a little squished together. I would put newlines between my methods to make it a little clearer where one unit of responsibility starts and the previous one stops.

Second, please use your braces. And if you aren't going to use braces, then consistently don't use them:


if (!HasNext)
    return -1;

while (used.Contains(next))
{
    next = rand.Next(start, range + start);                  
}



Third, parameters are named with camelCase by convention in C#:


public void Reset (int RangeCount = 100, int Start = 1)



Fourth, please put spaces around your operators:


if (RangeCount&lt; 1)





In the if/else if block in Next(), you do range-- at the top of each block. You should move this to just above the conditional if it is going to happen either way. However, I'm not quite sure if it is supposed to use the -- operator in each given that the comment for the first says you are trimming the top of the range and the comment for the other says you are trimming the bottom.




//in .NET end is not inclusive



This comment is not really needed, unless you are reminding yourself about it. Robert C. Martin states in Clean Code that every time you use a comment to explain your code, what the comment is really saying is that you failed to write your code so it explains what it does itself. After reading and writing many comments myself, I have to agree with him.



C# 6 would allow you to use the =&gt; expression for your one-line calculated properties:

public bool HasNext =&gt; CountLeft &gt; 0;


Instead of:


public bool HasNext { get { return (CountLeft &gt; 0); } }