الجمع بين القوائم في Lambda/LINQ
سؤال
إذا كان لدي متغير من النوع IEnumerable<List<string>>
هل هناك عبارة LINQ أو تعبير lambda يمكنني تطبيقه عليه والذي سيجمع بين القوائم التي ترجع ملف IEnumerable<string>
?
المحلول
حدد العديد - أي
IEnumerable<List<string>> someList = ...;
IEnumerable<string> all = someList.SelectMany(x => x);
بالنسبة لكل عنصر في someList، يستخدم هذا لامدا "x => x" للحصول على IEnumerable<T> للعناصر الداخلية.في هذه الحالة، كل "x" عبارة عن قائمة<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
- لا يبدو أن هذا هو كل ما قصدته بالبيان الافتتاحي.أردت فقط توضيح ذلك في حالة إرباك أي شخص أو تعليقه - أدركت بعد أن نشرت كيف كان من الممكن قراءته).
اصنع طريقة بسيطة.لا حاجة للينك:
IEnumerable<string> GetStrings(IEnumerable<List<string>> lists)
{
foreach (List<string> list in lists)
foreach (string item in list)
{
yield return item;
}
}
باستخدام تعبير LINQ...
IEnumerable<string> myList = from a in (from b in myBigList
select b)
select a;
...يعمل بشكل جيد.:-)
b
سيكون IEnumerable<string>
و a
سوف يكون string
.
إليك فهمًا آخر لاستعلام LINQ.
IEnumerable<string> myStrings =
from a in mySource
from b in a
select b;