string. List <int> 또는 다른 형식에 조인


86

배열 또는 정수 목록을 다음과 같이 쉼표로 구분 된 문자열로 바꾸고 싶습니다.

string myFunction(List<int> a) {
    return string.Join(",", a);
}

그러나 string.Join List<string>은 두 번째 매개 변수 로만 사용됩니다 . 이를 수행하는 가장 좋은 방법은 무엇입니까?


2
어떤 버전의 C # /. NET을 사용하고 있습니까?
Mark Byers

답변:


149

가장 좋은 방법은 원하는 작업을 수행하는 오버로드가있는 .NET 4.0으로 업그레이드하는 것입니다.

업그레이드 할 수없는 경우 Select 및 ToArray를 사용하여 동일한 효과를 얻을 수 있습니다.

    return string.Join(",", a.Select(x => x.ToString()).ToArray());

또한 그가 적어도 C # 3, .NET 3.5에 있다고 가정합니다
Anthony Pegram

기본 제공 ToArray방법 대신 LINQ를 사용하는 이유 는 List<T>무엇입니까?
Steven Sudit

2
그는 List <int>를 가질 것이기 때문입니다. linq select는 List <int>를 IEnumerable <string>으로 변환 한 다음 배열로 변환합니다.
Greg Bogumil

4.0으로 업그레이드하는 것은 제 상황에서 실용적이지 않지만 LINQ 솔루션은 제가 찾던 바로 그 솔루션입니다. 감사!
Code Commander

1
@gbogumil : 죄송합니다 int..
Steven Sudit

5

.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));

즐겨!


+1 : .NET 4.0 이전에 선호하는 방법입니다. String.Join(String, String[])호출 할 수 있도록 int 목록에서 완전히 새로운 문자열 배열을 생성하는 것보다 훨씬 확장 가능 합니다. 내가 말하고 싶은 것은이 메소드가 String반대로 확장으로 작성된 것을 보는 것은 드문 일이라는 것입니다. 저는 IEnumerable<String>항상 확장 메소드 호출의 긴 체인 끝에 호출하는 경향이 있습니다.
Alex Humphrey

2
나는 그것이 도움이된다면 파이썬에서 아이디어를 훔쳤다!
삭제

4

.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();
}

3
좋은 2.0 접근법. 결합 문자를 메소드에 하드 코딩하는 대신 매개 변수로 만들 수 있습니다.
Anthony Pegram

일반적인 최적화는 테스트없이 구분 기호를 추가 한 다음 루프를 벗어나면 마지막 문자를 제거하는 것입니다.
Steven Sudit

@Steven-나는 그것에 대해 생각하고 있었지만 이것은 또한 문자열의 길이에 달려 있다고 생각합니다 (테스트 없이는 확실하지 않습니다). 그래서 간단한 bool 검사를 고수했습니다.
Kyle Rosendo

최적화는 긴 문자열에 대해서만 측정 가능할 것이라고 생각합니다. 그렇긴하지만 짧은 동영상이라도 느려질 것이라고 생각하지 않습니다.
Steven Sudit

3

내가 이것으로 수정 한 유사한 확장 방법이 있었다

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메서드가 있고이 새로운 메서드는 완전히 다른 작업을 수행하므로 사용이 직관적이지 않습니다. 둘째, 이 메서드를 만들려 경우 계속 진행하여 일반적으로 적용 할 수 있습니다.
Anthony Pegram 2010-08-31

Ruby의 배열에 대한 조인 방법을 모방 한 해킹입니다. ruby-doc.org/core/classes/Array.html#M002182
Jonas Elfström

또한 .ToString ()은 항상 T의 문자열 표현을 반환하지 않으므로 실제로 혼란을 일으킬 수 있습니다.
Jonas Elfström

2

이 대답은 아직 .NET 4.0의 깊이에 도전하고 싶지 않은 경우에 적합합니다.

String.Join ()은 각 요소 사이에 지정된 구분 기호를 사용하여 문자열 배열의 모든 요소를 ​​연결합니다.

구문은

public static string Join(
    string separator,
    params string[] value
)

Int 목록을 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);
}

3
누군가가 아직 2.0을 사용하는 경우 이는 적절한 접근 방식입니다. 그러나 intArray불필요합니다. List<int>인덱싱 가능하고 Count속성 이 있으므로 배열로의 변환이 불필요합니다. 또한 결합 문자를 메서드에 하드 코딩하는 대신 매개 변수로 만들 수 있습니다.
Anthony Pegram 2010-08-31

2

.NET 4.0 사용

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);
    }
}

2

.NET에서 목록 클래스에는 .ToArray()메서드가 있습니다. 다음과 같이 작동 할 수 있습니다.

string myFunction(List<int> a)
{
    return string.Join(",", a.ToArray());
}

참조 : List <T> 메서드 (MSDN)


이것은 answer from 2010이미로, 그 상태 ToString을 할 때 암시한다 string.Join.
밀러
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.