2009-06-01 5 views
11

LINQを使用してオブジェクトのコレクションを単一の新しいオブジェクトに変換する方法はありますか?string.Join(string、string [])と同等のLINQはありますか

これを別のLINQ to SQL式で使用したいと考えています。

+6

あなたは*効果*(http://stackoverflow.com/questions/934327)は本日、以前にこれを尋ねた - LINQは、 –

+0

@Marc Gravellおかげから変更されていません。私はLINQがこの1時間以内に変更されていないことを知っています、私はちょうど連結を行う方法についての明確化を得ようとしていました。 –

+0

@Marc Gravellの答え(http://stackoverflow.com/questions/934327)と@Jon Skeetの答えは正しいです。 @ bruno condeと@Scott Iveyの答えは間違っています。したがって、@ Jon Skeetの回答を受け入れられた回答としてマークする必要があります。 –

答えて

19

を連結string.Join自体?

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

問題は、それがSQLに変換されるのではないかということです。たぶんそれは - しかし、私はそれを疑う。それが動作する場合、私はちょうど私の答えを完全に削除する幸せです:) –

+2

linqpadで簡単なテストの後、私はこれがSQLに変換されるとは思わない。 OPがこれを翻訳する必要があるなら、私は彼があなたやMarcのようなストアドプロシージャを選ぶべきだと思うと思います。 –

+0

Dammitなぜ私はこれを見ていないのですか?私はこれとすべてを行う独自の拡張メソッドを構築しました。 –

7

通常の方法は、集計演算子(Aggregate,、Averageなど)のいずれかを使用することですが、そのタイプと実行する操作は完全に異なります。どのようなタイプに興味がありますか?

編集:さて、文字列を連結したいと思います...私はそうではありません LINQ to SQL自体には何かがあります。オプション:

  • SQL
  • でそれを行うにはストアドプロシージャまたはTVFを書く
  • は、LINQ to SQLでの個々の文字列を取得し、クライアント側で、あなたが使用していないのはなぜ
+0

これは文字列です。たとえば、区切り文字列を使用して追加する必要があります。 "、"または "
" –

+0

@ OP。文字列を追加するだけの場合は、StringBuilderを使用しないでください。 – Gishu

+0

@ジョンOTしかし、あなたは質問926352を見てみることができます..あなたは私の理解の緩やかな終わりを結びつけることができますか? – Gishu

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

これは文字列の列挙可能ではうまく動作しますが、LINQ to SQLではサポートされていないようです(OPは別のLINQ to SQL式でこれを使用したいと書いています):NotSupportedExceptionを "サポートされています。 –

3

ここでのソリューションのほとんどは、あなたがた値の数が多い場合は、concatonateしたいかなり非効率的です。また、それらのすべてが読めるわけではありません。この種のことを頻繁にやるつもりなら、独自の拡張メソッドを構築する価値があります。以下の実装では、string.Join(", ", arrayOfStrings)と同等の処理を行うことができます。ここで、arrayOfStringsはIEnumerable<T>であり、separatorはどのオブジェクトでもかまいません。それはあなたがこのような何かを行うことができます:

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

このことについて私が好きな2つのことは、次のとおりです。

  1. それはLINQのコンテキストで非常に読みやすいです。
  2. StringBuilderを使用し、データベースシナリオ(L2S、L2E、またはL2Nh)で重要な列挙を2回評価することを避けるため、かなり効率的です。
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(); 
} 
関連する問題