I like the basic philosophy behind string functions in Delphi, and never understood why the same wasn't done in C#.
String functions in C# typically blow up with exceptions, while in Delphi they typically do the best they can, and typically can't blow up. Delphi string functions results in far less coding, because there's no need to check for index out of range or other possible causes of exceptions, and it's usually far easier to comprehend the possible outcomes of an expression.
For example, SubString in C# will blow up if any index is out of range, which frequently makes it necessary to do a lot of extra checking. Copy in Delphi is basically the same function, but will not blow up, and instead return whatever lies within the given subrange. Safe, logical, easy.
When programming in F#, I typically end up implementing a lot of string functions borrowed from Delphi.
Of course I only suggest this as one more source of inspiration, and of course it overlaps heavily with other suggestions.
I do not like that existing keywords - do, while - are used for this loop construct, especially since "while" is already used for another loop construct. In Pascal syntax this loop construct is called repeat-until. It tells you immediately on top of the loop what this is ("do" doesn't since it's used already), and to expect an "until" at the bottom.
I'd also like to go on record as not wanting this. Colin Bull and others has already explained why it should stay the way it is.