使用string.Join方法可以将List<int>或其他类型的数据连接成字符串。

110
我想将一个整数数组或列表转换成逗号分隔的字符串,就像这样:
string myFunction(List<int> a) {
    return string.Join(",", a);
}

但是string.Join只接受List<string>作为第二个参数。最好的方法是什么?


2
你使用的是哪个版本的C# / .NET? - Mark Byers
可能是 https://dev59.com/lXA75IYBdhLWcg3wlqOh 的重复问题。 - goodeye
7个回答

181

最好的方法是升级到.NET 4.0或更高版本,其中有一个重载可以实现您想要的功能:

如果无法升级,则可以使用Select和ToArray来实现相同的效果。

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

1
为什么要使用LINQ而不是List<T>内置的ToArray方法? - Steven Sudit
2
因为他会有一个List<int>。linq select将List<int>转换为IEnumerable<string>,然后再转换为数组。 - Greg Bogumil
1
@gbogumil:抱歉,没有注意到它是一个“int”。 - Steven Sudit
这也适用于其他方法,例如 a.Select(x => x.Code).ToArray());,而不仅仅是 ToString() - Gerard
2
可以避免使用.ToArray(),因为Join方法接受IEnumerable<string>。 - Fernando Torres
显示剩余2条评论

7
在.NET中,列表类有一个名为.ToArray()的方法。可以尝试使用以下代码:
string myFunction(List<int> a)
{
    return string.Join(",", a.ToArray());
}

参考:List<T> 方法(MSDN)


这个2010年的回答已经说明了,在执行string.Join时,ToString是隐含的。 - Miller

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[])要可扩展得多。唯一需要注意的是,将此方法编写为对String的扩展而不是对IEnumerable<String>的扩展是不寻常的 - 我倾向于在长串的扩展方法调用末尾始终调用它。 - Alex Humphrey
2
我从Python那里偷了这个想法,如果有帮助的话! - Deleted

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 - 我曾经考虑过这个问题,但我认为这也取决于字符串的长度(没有进行测试,我不确定),所以我坚持使用简单的布尔检查。 - 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
这是一种在Ruby中模仿数组join方法的黑客技巧。http://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
)

建议首先构建一个字符串数组,而不是将整数列表传递给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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接