Я хочу перетворити масив або список ints на рядок, розділений комами, наприклад:
string myFunction(List<int> a) {
return string.Join(",", a);
}
Але string.Join приймає лише List<string>
другий параметр. Який найкращий спосіб це зробити?
Я хочу перетворити масив або список ints на рядок, розділений комами, наприклад:
string myFunction(List<int> a) {
return string.Join(",", a);
}
Але string.Join приймає лише List<string>
другий параметр. Який найкращий спосіб це зробити?
Відповіді:
Найкращий спосіб - це оновити до .NET 4.0, де є перевантаження, яка робить те, що ви хочете:
Якщо ви не можете оновити, ви можете досягти того ж ефекту за допомогою Select та ToArray.
return string.Join(",", a.Select(x => x.ToString()).ToArray());
ToArray
методу List<T>
?
int
.
Масштабований і безпечний реалізація родових перелічуваних рядків об'єднуються для .NET 3.5. Використання ітераторів полягає в тому, щоб значення рядка приєднання не застрягло в кінці рядка. Він правильно працює з елементами 0, 1 і більше:
public static class StringExtensions
{
public static string Join<T>(this string joinWith, IEnumerable<T> list)
{
if (list == null)
throw new ArgumentNullException("list");
if (joinWith == null)
throw new ArgumentNullException("joinWith");
var stringBuilder = new StringBuilder();
var enumerator = list.GetEnumerator();
if (!enumerator.MoveNext())
return string.Empty;
while (true)
{
stringBuilder.Append(enumerator.Current);
if (!enumerator.MoveNext())
break;
stringBuilder.Append(joinWith);
}
return stringBuilder.ToString();
}
}
Використання:
var arrayOfInts = new[] { 1, 2, 3, 4 };
Console.WriteLine(",".Join(arrayOfInts));
var listOfInts = new List<int> { 1, 2, 3, 4 };
Console.WriteLine(",".Join(listOfInts));
Насолоджуйтесь!
String.Join(String, String[])
можна було викликати. Єдине, що я б сказав, це незвично бачити цей метод, написаний як розширення, на String
відміну від нього IEnumerable<String>
- я, як правило, завжди називаю його в кінці довгого ланцюжка викликів методу розширення.
.NET 2.0:
static string IntListToDelimitedString(List<int> intList, char Delimiter)
{
StringBuilder builder = new StringBuilder();
for (int i = 0; i < intList.Count; i++)
{
builder.Append(intList[i].ToString());
if (i != intList.Count - 1)
builder.Append(Delimiter);
}
return builder.ToString();
}
Ця відповідь для вас, якщо ви ще не хочете заглибитися в надра .NET 4.0.
String.Join () об'єднує всі елементи масиву рядків, використовуючи вказаний роздільник між кожним елементом.
Синтаксис є
public static string Join(
string separator,
params string[] value
)
Замість того, щоб передавати свій список ints методу Join, я пропоную спочатку створити масив рядків.
Ось, що я пропоную:
static string myFunction(List<int> a) {
int[] intArray = a.ToArray();
string[] stringArray = new string[intArray.Length];
for (int i = 0; i < intArray.Length; i++)
{
stringArray[i] = intArray[i].ToString();
}
return string.Join(",", stringArray);
}
intArray
це непотрібно. List<int>
індексується та має Count
властивість, що робить перетворення масиву зайвим. Ви також можете зробити приєднуючий символ параметром, а не жорстко його кодувати в методі.
Мав подібний метод розширення, який я модифікував до цього
public static class MyExtensions
{
public static string Join(this List<int> a, string splitChar)
{
return string.Join(splitChar, a.Select(n => n.ToString()).ToArray());
}
}
і ти використовуєш це так
var test = new List<int>() { 1, 2, 3, 4, 5 };
string s = test.Join(",");
.NET 3.5
IEnumerable<T>
вже має Join
метод, і цей новий метод виконує зовсім іншу операцію, роблячи його використання протиінтуїтивним. По- друге, якщо ви були мають намір створити цей метод, йти вперед і зробити це в загальному може бути застосовано.
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string s = myFunction(PopulateTestList());
this.TextBox1.Text = s;
}
protected List<int> PopulateTestList()
{
List<int> thisList = new List<int>();
thisList.Add(22);
thisList.Add(33);
thisList.Add(44);
return thisList;
}
protected string myFunction(List<int> a)
{
return string.Join(",", a);
}
}
У .NET клас списку має .ToArray()
метод. Щось подібне може спрацювати:
string myFunction(List<int> a)
{
return string.Join(",", a.ToArray());
}
Посилання: Список методів <T> (MSDN)
answer from 2010
вже говорить про те, що, як ToString
це мається на увазі при виконанні a string.Join
.