public static IEnumerable<IEnumerable> GeneratePermutations(IEnumerable source)
{
	var c = source.Count();
	if (c == 1)
		yield return source;
	else
		for (int i = 0; i < c; i++)
			foreach (var shorter_permuttaion in GeneratePermutations(source.Take(i).Concat(source.Skip(i + 1))))
				yield return source.Skip(i).Take(1).Concat(shorter_permuttaion);
}

// Also, please take a look at https://www.intermedia.net/login/voice/