This is to present an alternative for Word wrap without cutting words. This simplifies the code using
string.Split and LINQ (although I also provide a non-LINQ version for comparison). It also separates the word wrapping funtionality as extension methods in a static class. Finally, I include a WinForms application to demonstrate the code.
The basic idea is to wrap a single line of text (string) to fit a given width, breaking into separate lines only at word boundaries, defined here as "space-delimited". However, the boundary case of a word that is, by itself, longer than the given width is ambiguous. I.e., (a) split the word to fit, or (b) allow single words that are over width. I decided to provide an optional parameter to choose the desired behavior.
The use of
string.Split() reduces apparent complexity (especially in the simple case of allowing overwide words) and avoids character-by-character reprocessing when splitting.
Also, instead of coupling to the WinForms
Font classes, the implementation takes a
Predicate<string>) that tests if a string "fits". The caller is free to determine fitting by any means desired.
string input = "This is the test string, with some veeerrrryyy looooong words!";
int wrapWidth = 160; Predicate<string> stringFits = s => TextRenderer.MeasureText(s, font).Width < wrapWidth;
string Ret = input.WordWrap(stringFits, false); string Ret = input.WordWrap(stringFits);
Points of Interest
WordWrapNonLinq() methods which implement the same functionality without using the Linq
.Aggregate() method. (This demonstrates what the
.Aggregate() is actually doing.)
I started programming in Basic on a DECSystem-10 as a Freshman at Caltech in 1974. I quickly transitioned to assembly language, Fortran, and Pascal. As a summer job at JPL, I did analysis of fuel consumption for the Viking Mars Orbiter attitude control system. I also spent a summer doing O/S maintenance at Digital Equipment Corporation.
After graduation, I started developing microprocessor development tools (e.g., cross-compiler, debugger) for Beckman Instruments, a scientific instrument company.
I've worked on custom file-systems, a real-time O/S for Z8000, Expert Systems (SpinPro & PepPro), and internal and external networking support (I was their first webmaster).
I've worked on the DNA analysis system.
I was the console/UI software architect for Ultracentrifuges and protein Capillary Electrophoresis systems.
After 35 years, Danaher having acquired Beckman (now Beckman Coulter), transferred the CE group to become part of AB Sciex (2014).