public string GetPartyAsString() { string message = ""; var groups = PartyDice.GroupBy(g => g.Name).OrderByDescending(g => g.Count()).Select(g => new { Key = g.Key, Count = g.Count() }); int companionCount = 0; string companionName = ""; if (groups.Count() == 1) { companionCount = groups.First().Count; companionName = groups.First().Key; if (companionCount > 1) { companionName = companionName == "thief" ? "thieves" : $"{companionName}s"; } message = $"{companionCount} {companionName}"; } else if (groups.Count() == 2) { List <string> formattedGroups = new List <string>(); foreach (var item in groups) { companionCount = item.Count; companionName = item.Key; if (companionCount > 1) { companionName = companionName == "thief" ? "thieves" : $"{companionName}s"; } formattedGroups.Add($"{companionCount} {companionName}"); } message = $"{formattedGroups[0]} and {formattedGroups[1]}"; } else if (groups.Count() > 2) { for (int i = 0; i < groups.Count(); i++) { companionCount = groups.ElementAt(i).Count; companionName = groups.ElementAt(i).Key; if (companionCount > 1) { companionName = companionName == "thief" ? "thieves" : $"{companionName}s"; } message += (i == groups.Count() - 1) ? $"and {companionCount} {companionName}" : $"{companionCount} {companionName}, "; } } else { message = "no companions"; } return(message); }