Truncate string on whole words in .NET C#

Viewed 50889

I am trying to truncate some long text in C#, but I don't want my string to be cut off part way through a word. Does anyone have a function that I can use to truncate my string at the end of a word?

E.g:

"This was a long string..."

Not:

"This was a long st..."
10 Answers

Taking into account more than just a blank space separator (e.g. words can be separated by periods followed by newlines, followed by tabs, etc.), and several other edge cases, here is an appropriate extension method:

    public static string GetMaxWords(this string input, int maxWords, string truncateWith = "...", string additionalSeparators = ",-_:")
    {
        int words = 1;
        bool IsSeparator(char c) => Char.IsSeparator(c) || additionalSeparators.Contains(c);

        IEnumerable<char> IterateChars()
        {
            yield return input[0];

            for (int i = 1; i < input.Length; i++)
            {
                if (IsSeparator(input[i]) && !IsSeparator(input[i - 1]))
                    if (words == maxWords)
                    {
                        foreach (char c in truncateWith)
                            yield return c;

                        break;
                    }
                    else
                        words++;

                yield return input[i];
            }
        }

        return !input.IsNullOrEmpty()
            ? new String(IterateChars().ToArray())
            : String.Empty;
    }
Related