配列またはintのリストを、次のようにコンマ区切りの文字列に変換したいと思います。
string myFunction(List<int> a) {
return string.Join(",", a);
}
ただし、string.JoinList<string>
は2番目のパラメーターとしてのみ使用します。これを行うための最良の方法は何ですか?
配列またはintのリストを、次のようにコンマ区切りの文字列に変換したいと思います。
string myFunction(List<int> a) {
return string.Join(",", a);
}
ただし、string.JoinList<string>
は2番目のパラメーターとしてのみ使用します。これを行うための最良の方法は何ですか?
回答:
最善の方法は、必要な処理を実行するオーバーロードがある.NET4.0にアップグレードすることです。
アップグレードできない場合は、SelectとToArrayを使用して同じ効果を得ることができます。
return string.Join(",", a.Select(x => x.ToString()).ToArray());
ToArray
メソッドの代わりにLINQを使用するのはなぜList<T>
ですか?
int
。
.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));
楽しい!
String.Join(String, String[])
呼び出すことができるように、intのリストから文字列のまったく新しい配列を生成するよりもはるかにスケーラブルです。私は言うだろう唯一のことは、それが上の拡張機能として書かれたこの方法を参照することは珍しいことだ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();
}
この答えは、まだ.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);
}
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());
}
参照:List <T>メソッド(MSDN)