2009-06-01 31 views
11

有沒有什麼方法可以使用LINQ將對象集合轉換爲單個新對象?是否有LINQ相當於string.Join(字符串,字符串[])

我想在另一個LINQ to SQL表達式中使用它。

+6

*您有效*問這個今天早些時候(http://stackoverflow.com/questions/934327) - LINQ從那時起 – 2009-06-01 12:51:58

+0

@Marc Gravell感謝並沒有改變。我知道LINQ在最近一小時左右沒有變化,我只是想弄清楚如何進行連接。 – 2009-06-01 13:01:40

+0

@Marc Gravell的答案(http://stackoverflow.com/questions/934327)和@Jon Skeet的答案在下面是正確的。 @bruno conde's和@Scott Ivey的回答是不正確的。因此,您應該將@Jon Skeet的答案標記爲已接受的答案。 – 2010-02-04 17:11:06

回答

19

你爲什麼不使用string.Join本身?

string.Join("<br/>", collection.Select(e => e.TextProp).ToArray()); 
7

正常的方法是使用聚合運營商(AggregateSumAverage等)中的一個,但它完全取決於類型和你想要做什麼。你對什麼類型感興趣?

編輯:好的,所以你想連接字符串...我不認爲有什麼會在LINQ to SQL本身做到這一點。選項:

  • 寫存儲過程或TVF做到在SQL
  • 取在LINQ各個串到SQL並連接回客戶端
12

可以使用聚合方法...

var myResults = (from myString in MyStrings 
       select myString) 
       .Aggregate(string.Empty, (results, nextString) 
        => string.Format("{0}<br />{1}", results, nextString)); 

var myResults = MyStrings.Aggregate(string.Empty, (results, nextString) 
        => string.Format("{0}<br />{1}", results, nextString)); 
3

這裏的大多數解決方案都,如果你有大量的值要concatonate效率非常低, 。而且,它們並不全是可讀的。如果你經常這樣做,那麼建立你自己的擴展方法是值得的。下面的實現允許您執行等效的string.Join(", ", arrayOfStrings),其中arrayOfStrings可以是IEnumerable<T>,分隔符可以是任何對象。它允許你做這樣的事情:

var names = new [] { "Fred", "Barney", "Wilma", "Betty" }; 
var list = names 
    .Where(n => n.Contains("e")) 
    .Join(", "); 

兩件事情我喜歡這個有:

  1. 很LINQ方面非常可讀的。
  2. 它非常高效,因爲它使用StringBuilder並避免在數據庫場景(L2S,L2E或L2Nh)中重複評估枚舉兩次。
public static string Join<TItem,TSep>( 
    this IEnumerable<TItem> enuml, 
    TSep     separator) 
{ 
    if (null == enuml) return string.Empty; 

    var sb = new StringBuilder(); 

    using (var enumr = enuml.GetEnumerator()) 
    { 
     if (null != enumr && enumr.MoveNext()) 
     { 
      sb.Append(enumr.Current); 
      while (enumr.MoveNext()) 
      { 
       sb.Append(separator).Append(enumr.Current); 
      } 
     } 
    } 

    return sb.ToString(); 
} 
相關問題