Join a collection of strings until character limit is reached Question

I wrote a function which will take a collection of strings — and return a comma-separated string which doesn't exceed the specified character limit.

It essentially works by joining the collection of strings over and over again, and removing the last item in the collection each time, until the comma-separated string doesn't exceed the specified character limit.

private static string Join(IEnumerable&lt;string&gt; collection, int characterLimit)
{
    var values = new List&lt;string&gt;(collection);
    var joined = string.Join(", ", values);
    while (joined.Length &gt; characterLimit)
    {
        values.RemoveAt(values.Count - 1);
        joined = string.Join(", ", values);
    }
    return joined;
}


I feel like there must more efficient way of doing this ... and that's what I'd love some help with.



Example

private string[] words =
{
    "able", "acid", "angry", "automatic", "awake", "bad", "beautiful", "bent", "bitter",
    "black", "blue", "boiling", "bright", "broken", "brown", "certain", "cheap", "chemical", "chief", "clean",
    "clear", "cold", "common", "complete", "complex", "conscious", "cruel", "cut", "dark", "dead", "dear",
    "deep", "delicate", "dependent", "different", "dirty", "dry", "early", "elastic", "electric", "equal",
    "false", "fat", "feeble", "female", "fertile", "first", "fixed", "flat", "foolish", "free", "frequent",
    "full", "future", "general", "good", "gray", "great", "green", "hanging", "happy", "hard", "healthy", "high",
    "hollow", "ill", "important", "kind", "last", "late", "left", "like", "living", "long", "loose", "loud",
    "low", "male", "married", "material", "medical", "military", "mixed", "narrow", "natural", "necessary",
    "new", "normal", "old", "open", "opposite", "parallel", "past", "physical", "political", "poor", "possible",
    "present", "private", "probable", "public", "quick", "quiet", "ready", "red", "regular", "responsible",
    "right", "rough", "round", "sad", "safe", "same", "second", "secret", "separate", "serious", "sharp",
    "short", "shut", "simple", "slow", "small", "smooth", "soft", "solid", "special", "sticky", "stiff",
    "straight", "strange", "strong", "sudden", "sweet", "tall", "thick", "thin", "tight", "tired", "true",
    "violent", "waiting", "warm", "wet", "white", "wide", "wise", "wrong", "yellow", "young"
};

private void joinButton_Click(object sender, EventArgs e)
{
    var characterLimit = 500; // the joined string's length will be &lt;= 500
    var joined = Join(words, characterLimit); // the joined string
    Console.WriteLine("joined: " + joined);
    Console.WriteLine("joined.Length: " + joined.Length);
}


Output

joined: able, acid, angry, automatic, awake, bad, beautiful, bent, bitter, black, blue, boiling, bright, broken, brown, certain, cheap, chemical, chief, clean, clear, cold, common, complete, complex, conscious, cruel, cut, dark, dead, dear, deep, delicate, dependent, different, dirty, dry, early, elastic, electric, equal, false, fat, feeble, female, fertile, first, fixed, flat, foolish, free, frequent, full, future, general, good, gray, great, green, hanging, happy, hard, healthy, high, hollow, ill
joined.Length: 495
Although @TopinFrassi's solution is death plain and simple, I would separate the fetching of the values which fit in the limit and the actual joining with the separator like so  

private static IEnumerable&lt;string&gt; FetchInRange(IEnumerable&lt;string&gt; collection, int characterLimit, int separationLength)
{

    int currentlength = -separationLength;

    foreach (var value in collection)
    {
        int length = value.Length + separationLength;
        currentlength += length;
        if (currentlength  &gt; characterLimit)
        {
            yield break;
        }

        yield return value;
    }

}
private static string Join(IEnumerable&lt;string&gt; collection, int characterLimit, string separator = ", ")
{
    return string.Join(separator, FetchInRange(collection, characterLimit, separator.Length));
}  


Each method has only one responsibility and they can be used for a wider range of separators as well.