سؤال

إذا كان لدي متغير من النوع 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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top