public static string CreateValueList(ValueListKind kind, IEnumerable<string> values) { // Ideally, we could denote the list kind (and the list itself) directly in the // message XML, and detect and expand in the MessageHandler.GenerateMessageString() // method. Doing so would make vararg-style messages much easier, but impacts // every single message we format. For now, callers just have to know when a // message takes a list of values in a single string argument, the caller will // have to do the expansion themselves. (And, unfortunately, hard-code the knowledge // that the list is an 'and' or 'or' list.) // For a localizable solution, we need to be able to get the list format string // from resources. We aren't currently localized right now, so the values are // just hard-coded. const string valueFormat = "'{0}'"; const string valueSeparator = ", "; string terminalTerm = String.Empty; switch (kind) { case ValueListKind.None: terminalTerm = ""; break; case ValueListKind.And: terminalTerm = "and "; break; case ValueListKind.Or: terminalTerm = "or "; break; } StringBuilder list = new StringBuilder(); // This weird construction helps us determine when we're adding the last value // to the list. Instead of adding them as we encounter them, we cache the current // value and append the *previous* one. string previousValue = null; bool haveValues = false; foreach (string value in values) { if (null != previousValue) { if (haveValues) { list.Append(valueSeparator); } list.AppendFormat(valueFormat, previousValue); haveValues = true; } previousValue = value; } // If we have no previous value, that means that the list contained no values, and // something has gone very wrong. Debug.Assert(null != previousValue); if (null != previousValue) { if (haveValues) { list.Append(valueSeparator); list.Append(terminalTerm); } list.AppendFormat(valueFormat, previousValue); haveValues = true; } return list.ToString(); }
public static string CreateValueList(ValueListKind kind, params string[] values) { return CreateValueList(kind, (IEnumerable<string>)values); }