16

タイプの変数がIEnumerable<List<string>>ある場合、それに適用できる LINQ ステートメントまたはラムダ式はありますIEnumerable<string>か?

4

6 に答える 6

34

SelectMany - すなわち

        IEnumerable<List<string>> someList = ...;
        IEnumerable<string> all = someList.SelectMany(x => x);

someList の各アイテムに対して、ラムダ "x => x" を使用して、内側のアイテムの IEnumerable<T> を取得します。この場合、各 "x" は List<T> であり、これは既に IEnumerable<T> です。

これらは、連続したブロックとして返されます。基本的に、SelectMany は次のようなものです (簡略化):

static IEnumerable<TResult> SelectMany<TSource, TResult>(
    this IEnumerable<TSource> source,
    Func<TSource, IEnumerable<TResult>> selector) {

    foreach(TSource item in source) {
      foreach(TResult result in selector(item)) {
        yield return result;
      }
    }
}

それはいくらか単純化されていますが。

于 2008-09-29T19:50:00.983 に答える
7

どうですか

myStrings.SelectMany(x => x)
于 2008-09-29T20:16:52.090 に答える
2

正確には単一のメソッド呼び出しではありませんが、書くことができるはずです

var concatenated = from list in lists from item in list select item;

「リスト」はあなたのものIEnumerable<List<string>>で、連結されたものはタイプIEnumerable<string>です。

(技術的には、これへの単一のメソッド呼び出しSelectManyです。最初のステートメントが意味するすべてのことのようには見えません。誰かが混乱したりコメントしたりした場合に備えて、それを明確にしたかっただけです。その方法を投稿した後で気づきました。読むことができた)。

于 2008-09-29T19:50:54.087 に答える
0

LINQ 式を使用しています...

IEnumerable<string> myList = from a in (from b in myBigList
                                        select b)
                             select a;

...うまくいきます。:-)

bになり、IEnumerable<string>aなりますstring

于 2008-09-29T20:02:12.997 に答える
0

簡単な方法を作ってください。LINQ は必要ありません:

IEnumerable<string> GetStrings(IEnumerable<List<string>> lists)
{
   foreach (List<string> list in lists)
   foreach (string item in list)
   {
     yield return item;
   }
 }
于 2008-09-29T19:56:48.317 に答える
0

別の LINQ クエリ内包表記を次に示します。

IEnumerable<string> myStrings =
  from a in mySource
  from b in a
  select b;
于 2008-09-29T20:10:36.863 に答える