string。加入List <int>或其他类型


Answers:


149

最好的方法是升级到.NET 4.0,其中存在可以满足您需要的重载:

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

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

还假定他至少使用C#3,.NET 3.5
Anthony Pegram

为什么要使用LINQ而不是内置ToArray方法List<T>
史蒂文·苏迪特

2
因为他会有一个List <int>。linq select将List <int>转换为IEnumerable <string>,然后转换为数组。
格雷格·博古米尔

在我的情况下,升级到4.0是不切实际的,但是LINQ解决方案正是我想要的。谢谢!
指挥官

1
@gbogumil:对不起,没有注意到这是一个int
史蒂文·苏迪特

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>-我倾向于总是在一长串扩展方法调用的末尾调用它。
亚历克斯·汉弗莱

2
如果有什么帮助,我从Python那里窃取了想法!
删除了2010年

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-我正在考虑,但是我认为这也取决于字符串的长度(我不确定是否需要测试),所以我坚持使用简单的bool检查。
凯尔·罗森多

我怀疑优化只能对长字符串进行测量。话虽如此,我认为即使是短篇小说也不会慢一些。
史蒂文·苏迪特

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

我有一个类似的扩展方法对此进行了修改

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方法,并且此新方法执行完全不同的操作,从而使其用法与直觉相反。其次,如果你要创建这个方法,继续前进,使之适用一般。
安东尼·佩格拉姆

这是一种模仿Ruby中数组连接方法的技巧。ruby-doc.org/core/classes/Array.html#M002182
乔纳斯·埃尔夫

而且.ToString()并不总是返回T的字符串表示形式,因此我想这可能会引起一些混乱。
JonasElfström

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
米勒
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.