30 Stimmen

Sammlung von Objekten zu einer kommagetrennten Zeichenkette zusammenfügen

An vielen Stellen in unserem Code haben wir Sammlungen von Objekten, aus denen wir eine kommagetrennte Liste erstellen müssen. Der Typ der Sammlung variiert: Es kann eine DataTable sein, aus der wir eine bestimmte Spalte benötigen, oder eine List<Customer>, usw.

Jetzt durchlaufen wir die Sammlung in einer Schleife und verwenden z. B. die String-Verkettung:

string text = "";
string separator = "";
foreach (DataRow row in table.Rows)
{
    text += separator + row["title"];
    separator = ", ";
}

Gibt es dafür ein besseres Muster? Idealerweise möchte ich einen Ansatz, den wir wiederverwenden können, indem wir einfach eine Funktion senden, um das richtige Feld/Eigenschaft/Spalte von jedem Objekt zu erhalten.

99voto

leppie Punkte 111830
string.Join(", ", Array.ConvertAll(somelist.ToArray(), i => i.ToString()))

12voto

Matt Howells Punkte 38730
static string ToCsv<T>(IEnumerable<T> things, Func<T, string> toStringMethod)
{
    StringBuilder sb = new StringBuilder();

    foreach (T thing in things)
        sb.Append(toStringMethod(thing)).Append(',');

    return sb.ToString(0, sb.Length - 1); //remove trailing ,
}

So verwenden:

DataTable dt = ...; //datatable with some data
Console.WriteLine(ToCsv(dt.Rows, row => row["ColName"]));

oder:

List<Customer> customers = ...; //assume Customer has a Name property
Console.WriteLine(ToCsv(customers, c => c.Name));

Ich habe keinen Compiler zur Hand, aber theoretisch sollte es funktionieren. Und wie jeder weiß, sind Theorie und Praxis dasselbe. In der Praxis sind sie es nicht.

11voto

Umang Patel Punkte 111

Ich fand string.Join und lambda Select<Func<>> hilft dabei, möglichst wenig Code zu schreiben.

List<string> fruits = new List<string>();
fruits.Add("Mango");
fruits.Add("Banana");
fruits.Add("Papaya");

string commaSepFruits = string.Join(",", fruits.Select(f => "'" + f + "'"));
Console.WriteLine(commaSepFruits);

List<int> ids = new List<int>();
ids.Add(1001);
ids.Add(1002);
ids.Add(1003);

string commaSepIds = string.Join(",", ids);
Console.WriteLine(commaSepIds);

List<Customer> customers = new List<Customer>();
customers.Add(new Customer { Id = 10001, Name = "John" });
customers.Add(new Customer { Id = 10002, Name = "Robert" });
customers.Add(new Customer { Id = 10002, Name = "Ryan" });

string commaSepCustIds = string.Join(", ", customers.Select(cust => cust.Id));
string commaSepCustNames = string.Join(", ", customers.Select(cust => "'" + cust.Name + "'"));

Console.WriteLine(commaSepCustIds);
Console.WriteLine(commaSepCustNames);

Console.ReadLine();

10voto

Hosam Aly Punkte 40063
// using System.Collections;
// using System.Collections.Generic;
// using System.Linq

public delegate string Indexer<T>(T obj);

public static string concatenate<T>(IEnumerable<T> collection, Indexer<T> indexer, char separator)
{
    StringBuilder sb = new StringBuilder();
    foreach (T t in collection) sb.Append(indexer(t)).Append(separator);
    return sb.Remove(sb.Length - 1, 1).ToString();
}

// version for non-generic collections
public static string concatenate<T>(IEnumerable collection, Indexer<T> indexer, char separator)
{
    StringBuilder sb = new StringBuilder();
    foreach (object t in collection) sb.Append(indexer((T)t)).Append(separator);
    return sb.Remove(sb.Length - 1, 1).ToString();
}

// example 1: simple int list
string getAllInts(IEnumerable<int> listOfInts)
{
    return concatenate<int>(listOfInts, Convert.ToString, ',');
}

// example 2: DataTable.Rows
string getTitle(DataRow row) { return row["title"].ToString(); }
string getAllTitles(DataTable table)
{
    return concatenate<DataRow>(table.Rows, getTitle, '\n');
}

// example 3: DataTable.Rows without Indexer function
string getAllTitles(DataTable table)
{
    return concatenate<DataRow>(table.Rows, r => r["title"].ToString(), '\n');
}

7voto

Ian Mercer Punkte 37031

In .NET 4 können Sie einfach Folgendes tun string.Join(", ", table.Rows.Select(r => r["title"]))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X