2011-06-06 45 views
3

語言:C#4.0以不同的方式加入列表

有一個List<string>值爲Value1,Value2,Value3等等。
我想對通用列表中加入使輸出應該是

string values = "Value1, Value2 and Value3"; 

,如果只有一個值

string values = "Value1"; 

我目前正在與and更換LastIndexOf,。但是並沒有那麼喜歡。
最有效的加入方法是什麼?

+0

爲什麼不加入除最後一個元素之外的所有元素,然後手動連接它?您的問題非常具體,我只是使用特定的解決方案並繼續。 – 2011-06-06 10:51:37

回答

2

您可以使用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"); 
+1

不,這根本不回答納文的問題... – 2011-06-06 10:52:19

+0

其實我加入這樣。 'string values = String.Join(「,」,myList);''ToArray()'在C#4.0中不需要 – naveen 2011-06-06 10:55:42

+0

所有相當不錯的答案。我接受這個。 @Kilzone:如果您不介意,我正在更新您的答案以供將來使用。 – naveen 2011-06-06 11:38:49

4
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]) 
} 
+0

您可以節省一定程度的縮進,如果您將'if(i> 0)'移動到'else'語句 – 2011-06-06 11:02:07

+0

+1 jason,它會更整潔。太多好的答案。 – naveen 2011-06-06 11:08:12

+0

@基倫你是對的,這樣它更好 – Stefan 2011-06-06 11:10:24

2

的不嚴肅的回答:

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 "),最簡單的方法是隻寫特殊情況。

3

我個人喜歡用從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; 
} 
+0

最「有效」而不是最LINQ的花式;) – Stefan 2011-06-06 10:57:12

+0

能夠省略特殊情況下的if-else鏈可以導致更高效的代碼:)但當然,探查者可以在有疑問時提供幫助。 – Christian 2011-06-06 10:59:14

+0

@Jason:是的:) @Christian:爲此+1。我喜歡它:) – naveen 2011-06-06 11:00:38

1

你可以加入使用功能是這樣的:

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); 
+0

+1好。我喜歡'lastSeparator'參數。非常周到:) – naveen 2011-06-06 11:13:43

1

方法:

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

+0

+1:謝謝你。 – naveen 2011-06-06 11:14:55

1
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();