2009-12-17 76 views
2

說我有一個對象列表,並且該對象有一個字符串屬性。我想獲得列表中每個對象的每個字符串屬性的值的逗號分隔列表。 這裏是1個辦法做到這一點(沒有LINQ)另一個臨牀問題

 

StringBuilder result = new StringBuilder() 
foreach(myObject obj in myList) 
{ 
    result.Append(obj.TheString); 
    result.Append(", "); 
} 
// then trim the trailing ", " and call ToString() on result, etc, etc... 
 

這是我在linqification第一槍。有沒有更好的辦法?

 

string result = string.Join(", ", myList.Select(myObj => myObj.TheString).ToArray()); 
 

這是一行代碼,但它看起來並不非常有效,我 - 只是想迭代列表建立一個數組,只是遍歷數組,並建立一個字符串...呼!

有沒有更好的方法?

回答

5

如果你想高效,使用Enumerable.AggregateStringBuilder

string result = myList.Aggregate(new StringBuilder(), 
           (sb, o) => sb.Append(o.TheString).Append(", ")) 
         .ToString(); 

原來的問題是,String.Join想要的數組。在.NET 4中,會有一個過載,需要IEnumerable<string>(我希望它會像上面那樣實現)。

+0

+1真正喜歡這樣的答案,顯示Linq可以做什麼!令我着迷的是,你可以將結果的類型設置爲StringBuilder(當然在移除.ToString()後)並設置一個斷點,並且在轉換爲字符串之前找到Linq評估已經完成......這增加了我對此的困惑在Linq中稱爲「延期評估」......但這不是你的問題! :)我將你的解決方案包裝在一個方法中,然後使用StringBuilder.Remove在轉換爲字符串之前擺脫最終的額外空間和逗號。將嘗試將其作爲擴展方法。謝謝 ! – BillW 2009-12-17 07:36:49

+0

延遲評估推遲產生'StringBuilder',但是'StringBuilder'本身並沒有被延期 - 儘管沒有什麼能夠避免編寫一個懶惰的'StringBuilder'(理論上它也很可能有基本的字符串懶惰,儘管這需要CLR支持)。 – 2009-12-17 18:39:02

1

我喜歡這種連接字符串的擴展方法。它基本上與您使用的技術相同,但是採用擴展方法進行包裝。我不會推薦它用於大型設置,因爲效率不是目標。對我的好處是表現(非常linqy),方便小套:

[Test] 
public void Should_make_comma_delimited_list() 
{ 
    var colors = new List<HasColor> 
    { 
     new HasColor { Color = "red" }, 
     new HasColor { Color = "green" }, 
     new HasColor { Color = "blue" } 
    }; 

    var result = colors.Implode(x => x.Color, ", "); 

    Assert.That(result, Is.EqualTo("red, green, blue")); 
} 

public class HasColor 
{ 
    public string Color { get; set; } 
} 

public static class LinqExtensions 
{ 
    public static string Implode<T>(this IEnumerable<T> list, Func<T, string> func, string separator) 
    { 
     return string.Join(separator, list.Select(func).ToArray()); 
    } 
} 
+0

+1讚賞! – BillW 2009-12-17 07:41:55

0

這裏的另一種方式(resultStringBuilder):

myList.ForEach(
    myObj => 
    { 
     if (result.Length != 0) 
      result.Append(","); 
     result.Append(myObj.TheString); 
    } 
    ); 
1

使用的string.join,這是不夠好。

優化分析器會告訴你這樣做。

使用StringBuilder進行版本的可讀性很差,而且您仍然得到了尾隨的逗號。