string.List <int>または他のタイプに参加する


86

配列またはintのリストを、次のようにコンマ区切りの文字列に変換したいと思います。

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

ただし、string.JoinList<string>は2番目のパラメーターとしてのみ使用します。これを行うための最良の方法は何ですか?


2
どのバージョンのC#/ .NETを使用していますか?
マークバイアーズ2010

回答:


149

最善の方法は、必要な処理を実行するオーバーロードがある.NET4.0にアップグレードすることです。

アップグレードできない場合は、SelectとToArrayを使用して同じ効果を得ることができます。

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

また、彼は少なくともC#3、.NET 3.5
Anthony Pegram 2010

の組み込みToArrayメソッドの代わりにLINQを使用するのはなぜList<T>ですか?
Steven Sudit 2010

2
彼はList <int>を持っているからです。linq selectは、List <int>をIEnumerable <string>に変換してから、配列に変換します。
グレッグボグミル2010

4.0へのアップグレードは私の状況では実用的ではありませんが、LINQソリューションはまさに私が探していたものです。ありがとう!
コードコマンダー

1
@gbogumil:申し訳ありませんが、それがであることに気づきませんでしたint
Steven Sudit 2010

5

.NET3.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:これは.NET4.0より前の私の好ましい方法です。String.Join(String, String[])呼び出すことができるように、intのリストから文字列のまったく新しい配列を生成するよりもはるかにスケーラブルです。私は言うだろう唯一のことは、それが上の拡張機能として書かれたこの方法を参照することは珍しいことだStringとは対照的に、をIEnumerable<String>-私は常に拡張メソッド呼び出しの長鎖の最後にそれを呼び出すする傾向があります。
Alex Humphrey

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アプローチ。結合文字をメソッドにハードコーディングするのではなく、パラメーターにすることをお勧めします。
アンソニーペグラム

一般的な最適化は、テストせずに区切り文字を追加し、ループから抜けたら最後の文字を削除することです。
スティーブンスディット

@ Steven-私はそれについて考えていましたが、これは文字列の長さにも依存すると思います(テストなしではわかりません)ので、単純なブールチェックに固執しました。
カイルロセンド

最適化は長い文字列に対してのみ測定可能であると思います。そうは言っても、短いものでも遅くなるとは思いません。
Steven Sudit 2010

2

この答えは、まだ.NET4.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プロパティを持っているため、配列への変換は不要です。また、結合文字をメソッドにハードコーディングするのではなく、パラメーターにすることもできます。
アンソニーペグラム2010

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メソッドがあり、この新しいメソッドはまったく異なる操作を実行するため、直感に反します。次に、このメソッドを作成する場合、先に進んで一般的に適用できるようにします。
アンソニーペグラム2010

これは、Rubyの配列のjoinメソッドを模倣したハックです。ruby-doc.org/core/classes/Array.html#M002182
ジョナスElfström

また、.ToString()は常にTの文字列表現を返すとは限らないため、混乱を招く可能性があると思います。
ジョナスElfström

2

.NET4.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.