static string[] SplitMultiMode( string s, out int count )
{
s = _canonize.Replace( s.Trim(), "+" );
string[] modes = s.Split( '+' );
count = modes.Length;
if ( count == 0 ) return Util.EmptyStringArray;
int i = modes[0].Length == 0 ? 1 : 0;
if ( modes[count - 1].Length == 0 ) count = count - 1 - i;
else count = count - i;
if ( count != modes.Length )
{
if ( count <= 0 ) return Util.EmptyStringArray;
string[] m = new string[count];
Array.Copy( modes, i, m, 0, count );
modes = m;
}
// Sort if necessary (more than one atomic mode).
if ( count > 1 )
{
Array.Sort( modes, StringComparer.Ordinal );
// And removes duplicates. Since this occur very rarely
// and that count is small we use a O(n) process that shifts
// the modes array.
i = count - 1;
string last = modes[i];
while ( --i >= 0 )
{
Debug.Assert( last.Length > 0, "There is no empty strings." );
string cur = modes[i];
if ( StringComparer.Ordinal.Equals( cur, last ) )
{
int delta = (--count) - i - 1;
if ( delta > 0 )
{
Array.Copy( modes, i + 2, modes, i + 1, delta );
}
}
last = cur;
}
}
return modes;
}