Набор соединения объектов в разделенную от запятой строку

Почему следующая печать кода "Different."?

blockquote>

Поскольку Arrays.equals выполняет функцию неглубокое сравнение . Поскольку массивы наследуют свой equals -метод из Object, для внутренних массивов будет выполняться сравнение идентичности, что не получится, поскольку a и b не относятся к тем же массивы.

Если вы перейдете на Arrays.deepEquals , он будет ожидать "Equal.", как ожидалось.

26
задан Helen Toomik 1 December 2008 в 10:45
поделиться

8 ответов

// 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');
}
10
ответ дан Kami 15 October 2019 в 06:47
поделиться
string.Join(", ", Array.ConvertAll(somelist.ToArray(), i => i.ToString()))
95
ответ дан leppie 15 October 2019 в 06:47
поделиться

Вы могли записать функцию, которая преобразовывает IEnumerable в разделенную строку запятой

public string Concat(IEnumerable<string> stringList)
{
    StringBuilder textBuilder = new StringBuilder();
    string separator = String.Empty;
    foreach(string item in stringList)
    {
        textBuilder.Append(separator);
        textBuilder.Append(item);
        separator = ", ";
    }
    return textBuilder.ToString();
}

, можно тогда использовать Linq для запросов набора/набора данных/и т.д. для обеспечения stringList.

6
ответ дан RMalke 15 October 2019 в 06:47
поделиться
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 ,
}

Использование как это:

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

или:

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

у меня нет компилятора для вручения, но в теории он должен работать. И как все знают в теории, практика и теория являются тем же. На практике они не.

11
ответ дан Matt Howells 15 October 2019 в 06:47
поделиться

Как в стороне: первая модификация, которую я сделал бы, должна использовать Класс StringBuilder вместо просто Строки - это сохранит ресурсы для Вас.

2
ответ дан Galwegian 15 October 2019 в 06:47
поделиться
string strTest = "1,2,4,6";
string[] Nums = strTest.Split(',');
Console.Write(Nums.Aggregate<string>((first, second) => first + "," + second));
//OUTPUT:
//1,2,4,6
1
ответ дан sra 15 October 2019 в 06:47
поделиться

Мне нравится Мэтт Хауэллс ответ в этом сообщении:

Мне пришлось превратить его в расширение:

public static string ToCsv<T>(this IEnumerable<T> things, Func<T, string> toStringMethod)

Использование: [Я получаю все электронные письма и превращая их в строку csv для писем]:

var list = Session.Find("from User u where u.IsActive = true").Cast<User>();

return list.ToCsv(i => i.Email);
2
ответ дан 28 November 2019 в 06:00
поделиться

В .NET 4 можно просто выполнить string.Join (",", table.Rows.Select (r => r ["title"]))

6
ответ дан 28 November 2019 в 06:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: