سؤال

أريد أن أحمل نتائج جملة أين عند القائمة ثم اتخاذ مجموعة النتائج وإنشاء نوع جديد فقط يحتوي على جميع حقوله التي تم إنشاؤها من مجاميع الاستعلام الأصلي. لذا بالنظر إلى المثال الأساسي أدناه، هل هناك على أي حال للجمع بين بيانات LinQ 2 في واحد؟ إذا كان الأصلي حيث لا يوجد لديه صفوف ثم يجب أن يعود فارغة. شكرا!

    class Foo
    {
        public int A { get; set; }
        public int B { get; set; }
    }
    List<Foo> lst = GetFooList();

        var q = (from f in lst
                 where f.A > 3
                 select f).ToList();
        if (q.Count != 0)
        {
            var qq = new
            {
                MinA = q.Min(l => l.A),
                MaxB = q.Max(h => h.B),
            };
            // now do something with qq
        }

تحديث: بالنسبة لوضعي، تحتوي المجموعة الأصلية على الكثير من العناصر ولكن بعد جملة أين توجد مجموعة النتائج صغيرة جدا. تعداد على مجموعة الثانية عدة مرات لا ينبغي أن تكون مشكلة. أحتاج أيضا إلى استخدام أولا وأخير في المجموعة للحصول على قيمة من تلك السجلات. المجموعة من خلال الإجابة سوف تعمل بشكل أفضل بالنسبة لي. الطريقة الإجمالية مثيرة للاهتمام للغاية وأعتقد أن لديك استخدام آخر لذلك.

هل كانت مفيدة؟

المحلول

( from f in GetFooList()
  where f.A > 3
  group f by 1 into g
  let MinA=g.Min(l=>l.A)
  let MaxB=g.Max(h=>h.B)
  select new {MinA, MaxB} ).SingleOrDefault()

نصائح أخرى

هذا الحل تكرار القائمة مرة واحدة فقط مع Aggregate(), ، ولكن بالنسبة لقوائم فارغة، سيعود قيمة البذور. بالمناسبة، قيم البذور int.MaxValue و int.MinValue لأن Math.Min(int.MaxValue, C) سوف تعود دائما ج ومثلا Math.Max(int.MinValue, C) سوف يعود دائما جيم

var b = lst.Where(f => f.A > 3)
           .Aggregate(
                  // seed, initial values
                  new
                  {
                     MinA = int.MaxValue,
                     MaxB = int.MinValue
                  },

                  // accumulator function
                  (a,f) => new
                  {
                     MinA = Math.Min(a.MinA , f.A),
                     MaxB = Math.Max(a.MaxB , f.B)
                  });
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top