Question

Je veux prendre les résultats d'une clause where sur une liste, puis prendre ce jeu de résultats et de créer un seul nouveau type qui a tous ses champs construits à partir d'agrégats de la requête initiale. Ainsi, compte tenu de l'exemple de base ci-dessous, est de toute façon de combiner les deux déclarations de LINQ en un seul? Si l'original où aucune ligne ne puis renvoyer la valeur null. Merci!

    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
        }

Mise à jour: Pour ma situation, l'ensemble d'origine a beaucoup d'articles mais après la clause where le jeu de résultats est très faible. Sur la deuxième énumération ensemble à plusieurs reprises ne devrait pas être un problème. Je dois aussi utiliser premier et dernier sur l'ensemble pour obtenir une valeur de ces dossiers. Le groupe en réponse sera mieux pour moi. La façon globale est très intéressante et je pense avoir une autre utilisation pour cela.

Était-ce utile?

La solution

( 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()

Autres conseils

Cette solution itère la liste une seule fois avec Aggregate(), mais pour les listes vides, il retournera la valeur de départ. Soit dit en passant, les valeurs de semences sont int.MaxValue et int.MinValue parce que Math.Min(int.MaxValue, C) retournera toujours C et même Math.Max(int.MinValue, C) retournera toujours 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)
                  });
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top