Почему следующая печать кода
blockquote>"Different."
?Поскольку
Arrays.equals
выполняет функцию неглубокое сравнение . Поскольку массивы наследуют свойequals
-метод изObject
, для внутренних массивов будет выполняться сравнение идентичности, что не получится, посколькуa
иb
не относятся к тем же массивы.Если вы перейдете на
Arrays.deepEquals
, он будет ожидать"Equal."
, как ожидалось.
// 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');
}
string.Join(", ", Array.ConvertAll(somelist.ToArray(), i => i.ToString()))
Вы могли записать функцию, которая преобразовывает 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.
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));
у меня нет компилятора для вручения, но в теории он должен работать. И как все знают в теории, практика и теория являются тем же. На практике они не.
Как в стороне: первая модификация, которую я сделал бы, должна использовать Класс StringBuilder вместо просто Строки - это сохранит ресурсы для Вас.
string strTest = "1,2,4,6";
string[] Nums = strTest.Split(',');
Console.Write(Nums.Aggregate<string>((first, second) => first + "," + second));
//OUTPUT:
//1,2,4,6
Мне нравится Мэтт Хауэллс ответ в этом сообщении:
Мне пришлось превратить его в расширение:
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);
В .NET 4 можно просто выполнить string.Join (",", table.Rows.Select (r => r ["title"]))