2012-12-11 3 views
7

comment peut-on utiliser des plages groupées égales ou supérieures à?Groupe par gamme en utilisant linq

var data = new[] { 
    new { Id = 0, Price = 2 }, 
    new { Id = 1, Price = 10 }, 
    new { Id = 2, Price = 30 }, 
    new { Id = 3, Price = 50 }, 
    new { Id = 4, Price = 120 }, 
    new { Id = 5, Price = 200 }, 
    new { Id = 6, Price = 1024 }, 
}; 

var ranges = new[] { 10, 50, 100, 500 }; 
var grouped = data.GroupBy(x => ranges.FirstOrDefault(r => r > x.Price)); 

grouped ouput is 
price 10-50 -> 3 
price 50-100 -> 1 
price 100-500 -> 2 

sortie nécessaire est groupée par égale ou supérieure à la plage utilisée

price >= 10 -> 6 
price >= 50 -> 4 
price >= 100 -> 3 
price >= 500 -> 1 
+0

'100 -> 2' devrait être' 100 -> 3', puisque vous semblez utiliser le nombre d'objets s ayant un prix égal ou supérieur à la gamme utilisée. (Vous devriez essayer de clarifier votre question d'ailleurs, puisque nulle part vous mentionnez une sorte de COUNT) –

+0

@Francis P merci .. j'ai édité mon poste .. J'ai besoin exactement Compte des articles ayant un prix égal ou supérieur à la gamme utilisée . – stackCoder

Répondre

10
var grouped = ranges.Select(r => new { 
      Price = r, 
      Count = data.Where(x => x.Price >= r).Count() }); 

Et une autre option (si vous avez des données énormes, puis le regroupement est mieux que d'énumérer toutes les données pour chaque prix groupe):

var priceGroups = data.GroupBy(x => ranges.FirstOrDefault(r => r > x.Price)) 
         .Select(g => new { Price = g.Key, Count = g.Count() }) 
         .ToList(); 

var grouped = ranges.Select(r => new 
{ 
    Price = r, 
    Count = priceGroups.Where(g => g.Price > r || g.Price == 0).Sum(g => g.Count) 
}); 
+0

merci d'avoir résolu mon problème. @lazyberezovsky – stackCoder

+0

@cosmicgate Je ne vois aucune catégorie dans votre question. Qu'est-ce que c'est? –

+0

@cosmicgate désolé, mais une nouvelle exigence invalide les réponses actuelles. Je pense qu'il est préférable de créer une nouvelle question pour cela –

1

Regroupement partitions la source, chaque élément est affecté à un seul groupe.

Qu'est-ce que vous avez est un bon point de départ:

var data = new[] { 
    new { Id = 0, Price = 2 }, 
    new { Id = 1, Price = 10 }, 
    new { Id = 2, Price = 30 }, 
    new { Id = 3, Price = 50 }, 
    new { Id = 4, Price = 120 }, 
    new { Id = 5, Price = 200 }, 
    new { Id = 6, Price = 1024 }, 
}; 

var ranges = new[] { 10, 50, 100, 500 }; 
var grouped = data.GroupBy(x => ranges.FirstOrDefault(r => r <= x.Price)); 

suivre avec:

int soFar = 0; 
Dictionary<int, int> counts = grouped.ToDictionary(g => g.Key, g => g.Count()); 
foreach(int key in counts.Keys.OrderByDescending(i => i)) 
{ 
    soFar += counts[key]; 
    counts[key] = soFar; 
} 

Ou si vous voulez le faire dans une déclaration LINQ:

int soFar = 0; 
var grouped = data 
    .GroupBy(x => ranges.FirstOrDefault(r => r <= x.Price)) 
    .OrderByDescending(g => g.Key) 
    .Select(g => 
    { 
    soFar += g.Count(); 
    return new Tuple<int, int>(g.Key, soFar) 
    });