語言:C#4.0以不同的方式加入列表
有一個List<string>
值爲Value1,Value2,Value3等等。
我想對通用列表中加入使輸出應該是
string values = "Value1, Value2 and Value3";
,如果只有一個值
string values = "Value1";
我目前正在與and
更換LastIndexOf
,
。但是並沒有那麼喜歡。
最有效的加入方法是什麼?
語言:C#4.0以不同的方式加入列表
有一個List<string>
值爲Value1,Value2,Value3等等。
我想對通用列表中加入使輸出應該是
string values = "Value1, Value2 and Value3";
,如果只有一個值
string values = "Value1";
我目前正在與and
更換LastIndexOf
,
。但是並沒有那麼喜歡。
最有效的加入方法是什麼?
您可以使用String.Join(string glue, string[] array);
函數。
string values = String.Join(", ", myList.ToArray());
希望有所幫助。 (注:myList
是你已經在你的應用程序當中的列表。)
更新:注意到你和要求有點太晚了,我appologies,這裏是一個小更新:
string values = String.Join(", ", myList.Take(myList.Count - 1))
+ " and " + myList.Last();
或者(或者甚至更好),您可以使用StringBuilder
來代替字符串連接。 (切記:您仍然需要檢查列表中是否只有一個值。)
更新:這是一個簡單的擴展方法。
public static string SmartJoin(this List<string> items, string lastSeparator)
{
string values = "";
if(!items.Any())
{
return "";
}
if (items.Count > 1)
{
values = String.Format("{0} {1} {2}",
String.Join(", ", items.Take(items.Count - 1)),
lastSeparator,
items.Last());
}
else
{
values = items.First();
}
return values;
}
,人們可以這樣調用它
string values = myList.SmartJoin("and");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < list.Count; i++)
{
if (i == sb.Count - 1)
{
sb.Append(" and ");
}
else if (i > 0)
{
sb.Append(", ");
}
sb.Append(list[i])
}
的不嚴肅的回答:
var sb = new StringBuilder();
for(int i = 0; i < items.Count; i++)
{
if(i != 0)
{
if(i == items.Count-1) sb.Append(" and ");
else sb.Append(", ");
}
sb.Append(items[i]);
}
return sb.ToString();
如果要完成具有幾個特殊情況的操作(沒有前導或尾隨逗號,最後一個逗號實際上是" and "
),最簡單的方法是隻寫特殊情況。
我個人喜歡用從Enumerable
- 命名的方法,像這樣的任務:)
List<string> values = new List<string>() { "Value1", "Value2", "Value3"};
string result = "";
if (values.Count == 1) {
result = values[0];
}
else if (values.Count > 1) {
var init = values.Take(values.Count - 1);
var temp = init.Aggregate((acc, x) => acc + ", " + x);
temp += " and " + values[values.Count -1];
result = temp;
}
你可以加入使用功能是這樣的:
public string SmartJoin(string lastSeparator, List<string> array)
{
var lastElementPosition = array.Count - 1;
var lastValue = array[lastElementPosition];
array.RemoveAt(lastElementPosition);
return String.Join(lastSeparator, new[] { String.Join(", ", array), lastValue });
}
例子:
var items = new List<string> { "Value1", "Value2", "Value3" };
var result = SmartJoin(" and ", items);
+1好。我喜歡'lastSeparator'參數。非常周到:) – naveen 2011-06-06 11:13:43
方法:
個private static string ConvertToString(List<string> list)
{
if (!list.Any())
{
return string.Empty;
}
if (list.Count == 1)
{
return list.First();
}
return string.Join(", ", list.Take(list.Count - 1)) + " and " + list.Last();
}
例子
var list1 = new List<string> { "Value1", "Value2", "Value3", "Value4" };
var list2 = new List<string> { "Value1", "Value2", "Value3" };
var list3 = new List<string> { "Value1", "Value2" };
var list4 = new List<string> { "Value1" };
Console.WriteLine(ConvertToString(list1));
Console.WriteLine(ConvertToString(list2));
Console.WriteLine(ConvertToString(list3));
Console.WriteLine(ConvertToString(list4));
注:我使用的是.NET 4碼
UPDATE:刪除不必要的代碼 UPDATE2:做了一些代碼優化使用一些技巧形成@KilZone
+1:謝謝你。 – naveen 2011-06-06 11:14:55
var sb = new StringBuilder();
if (yourList.Count > 0)
{
sb.Append(yourList[0]);
if (yourList.Count > 1)
{
for (int i = 1; i < yourList.Count - 1; i++)
{
sb.Append(", ").Append(yourList[i]);
}
sb.Append(" and ").Append(yourList[yourList.Count - 1]);
}
}
string values = sb.ToString();
爲什麼不加入除最後一個元素之外的所有元素,然後手動連接它?您的問題非常具體,我只是使用特定的解決方案並繼續。 – 2011-06-06 10:51:37