タイプの変数がIEnumerable<List<string>>
ある場合、それに適用できる LINQ ステートメントまたはラムダ式はありますIEnumerable<string>
か?
6 に答える
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;
}
}
}
それはいくらか単純化されていますが。
どうですか
myStrings.SelectMany(x => x)
正確には単一のメソッド呼び出しではありませんが、書くことができるはずです
var concatenated = from list in lists from item in list select item;
「リスト」はあなたのものIEnumerable<List<string>>
で、連結されたものはタイプIEnumerable<string>
です。
(技術的には、これはへの単一のメソッド呼び出しSelectMany
です。最初のステートメントが意味するすべてのことのようには見えません。誰かが混乱したりコメントしたりした場合に備えて、それを明確にしたかっただけです。その方法を投稿した後で気づきました。読むことができた)。
LINQ 式を使用しています...
IEnumerable<string> myList = from a in (from b in myBigList
select b)
select a;
...うまくいきます。:-)
b
になり、IEnumerable<string>
にa
なりますstring
。
簡単な方法を作ってください。LINQ は必要ありません:
IEnumerable<string> GetStrings(IEnumerable<List<string>> lists)
{
foreach (List<string> list in lists)
foreach (string item in list)
{
yield return item;
}
}
別の LINQ クエリ内包表記を次に示します。
IEnumerable<string> myStrings =
from a in mySource
from b in a
select b;