String Ansatz
Ist hier ein Aggregate
mit einem StringBuilder
. Es gibt einige Positionsbestimmungen, die vorgenommen werden, um die Zeichenfolge zu bereinigen und das "und" einzufügen, aber alles geschieht unter der StringBuilder
Ebene.
var people = new[]
{
new { Id = 1, Name = "John" },
new { Id = 2, Name = "Mark" },
new { Id = 3, Name = "George" }
};
var sb = people.Aggregate(new StringBuilder(),
(s, p) => s.AppendFormat("{0}:{1}, ", p.Id, p.Name));
sb.Remove(sb.Length - 2, 2); // remove the trailing comma and space
var last = people.Last();
// index to last comma (-2 accounts for ":" and space prior to last name)
int indexComma = sb.Length - last.Id.ToString().Length - last.Name.Length - 2;
sb.Remove(indexComma - 1, 1); // remove last comma between last 2 names
sb.Insert(indexComma, "and ");
// 1:John, 2:Mark and 3:George
Console.WriteLine(sb.ToString());
Ein String.Join
Ansatz wurde stattdessen könnte aber das „und“ Einsetzen und Entfernen Komma erzeugen würde ~ 2 neue Saiten verwendet.
Regex Ansatz
Hier ist ein weiterer Ansatz regex, die durchaus verständlich ist (nichts zu kryptisch).
var people = new[]
{
new { Id = 1, Name = "John" },
new { Id = 2, Name = "Mark" },
new { Id = 3, Name = "George" }
};
var joined = String.Join(", ", people.Select(p => p.Id + ":" + p.Name).ToArray());
Regex rx = new Regex(", ", RegexOptions.RightToLeft);
string result = rx.Replace(joined, " and ", 1); // make 1 replacement only
Console.WriteLine(result);
Das Muster ist einfach ", "
. Die Magie liegt in der RegexOptions.RightToLeft
, die die Übereinstimmung von rechts macht und dadurch die Ersetzung beim letzten Komma-Auftreten bewirkt. Es gibt keine statische Regex
-Methode, die die Anzahl der Ersetzungen mit der RegexOptions
akzeptiert, daher die Instanzverwendung.
ähnliche Frage: http://stackoverflow.com/questions/788535 – Foole