private void Canonicalize() {
SingleRange CurrentRange;
int i;
int j;
char last;
bool Done;
_canonical = true;
_rangelist.Sort(0, _rangelist.Count, new SingleRangeComparer());
//
// Find and eliminate overlapping or abutting ranges
//
if (_rangelist.Count > 1) {
Done = false;
for (i = 1, j = 0; ; i++) {
for (last = ((SingleRange)_rangelist[j])._last; ; i++) {
if (i == _rangelist.Count || last == Lastchar) {
Done = true;
break;
}
if ((CurrentRange = (SingleRange)_rangelist[i])._first > last + 1)
break;
if (last < CurrentRange._last)
last = CurrentRange._last;
}
((SingleRange)_rangelist[j])._last = last;
j++;
if (Done)
break;
if (j < i)
_rangelist[j] = _rangelist[i];
}
_rangelist.RemoveRange(j, _rangelist.Count - j);
}
}