static void Main(string[] args)

{

string subject = "abcdefg";

// test harness, check it handles multiples of size and negatives and zero

for (int amount = -subject.Length * 3; amount < subject.Length * 3; amount++)

{

string result = RotateStringTest(subject, amount);

char[] inplace = subject.ToCharArray();

RotateString(inplace, amount);

if (amount % subject.Length == 0)

Debug.Assert(result.CompareTo(subject) == 0);

Debug.Assert(result.CompareTo(new String(inplace)) == 0);

}

}

/// <summary>

/// Rotates a string

/// </summary>

/// <param name="subject">string to rotate</param>

/// <param name="amount">< 0 left, 0 none, > 0 right</param>

/// <returns></returns>

private static void RotateString(char[] subject, int amount)

{

int length = subject.Length;

// negate rotations can be re-expressed as positive amounts

if (amount < 0)

amount = length - (-amount % length);

// 0 rotation mean return unchanged

if (amount % length == 0)

return;

int dest = amount;

char prev = subject[0];

do

{

dest %= length;

Swap(ref subject[dest], ref prev);

dest += amount;

} while (dest != amount);

}

/// <summary>

/// swaps two chars wihout using temp variable

/// </summary>

private static void Swap(ref char a, ref char b)

{

a ^= b;

b ^= a;

a ^= b;

}

/// <summary>

/// Rotates a string test (slow)

/// </summary>

/// <param name="subject">string to rotate</param>

/// <param name="amount">< 0 left, 0 none, > 0 right</param>

/// <returns></returns>

private static string RotateStringTest(string subject, int amount)

{

char[] result = subject.ToCharArray();

int length = subject.Length;

// negate rotations can be re-expressed as positive amounts

if (amount < 0)

amount = length - (-amount % length);

// 0 rotation mean return unchanged

if (amount % length != 0)

{

for (int pos = 0; pos < length; pos++)

{

int dest = (pos + amount) % length;

result[dest] = subject[pos];

}

}

return new String(result);

}

ps this post was really just to test this javascript code hightlighter.. It seems to work very well for both Xaml and C# - cool!

## No comments:

Post a Comment