2010-02-24 3 views
3

dans une liste, qui a obtenu 3 attributs Je veux retourner une nouvelle liste de cette catégorie lorsque attribut1 récidive dans la liste X égalecomment écrire ceci dans linq à la requête d'objet?

pour un exemple ce;

1, a, b
1, c, d
1, e, f
2, a, b
2, c, d
3, a, b
3, c, d
3, e, f
4, a, b
5, a, b
5, c, d
5, e, f
6, a, b
6, e, f

où X = 1 retournera cette liste

4, a, b

où X = 2 retournera cette liste

2, a, b
2, c, d
6, a, b
6, e, f

où X = 3 retournera cette liste

1, a, b
1, c, d
1, e, f
3, a, b
3, c, d
3, e, f
5, a, b
5, c, d
5, e, f

Répondre

3

cas parfait pour le regroupement!

var groups = list.GroupBy(s => s.Attribute1); 
var recur_1 = groups.Where(g => g.Count() == 1).SelectMany(s => s); 
var recur_2 = groups.Where(g => g.Count() == 2).SelectMany(s => s); 
var recur_3 = groups.Where(g => g.Count() == 3).SelectMany(s => s); 
+0

fixe où je n'ai pas appelé SelectMany –

+0

grâce, d'une personne de mort cérébrale :-) – Fredou

1
seq.Where(l => seq.Count(i => i.attrib1 == l.attrib1) == X); 
0
public static void Test() 
{ 
    var list = new[] 
       { 
        new {p1 = 1, p2 = 'a', p3 = 'b'}, 
        new {p1 = 1, p2 = 'c', p3 = 'd'}, 
        new {p1 = 1, p2 = 'e', p3 = 'f'}, 
        new {p1 = 2, p2 = 'a', p3 = 'b'}, 
        new {p1 = 2, p2 = 'c', p3 = 'd'}, 
        new {p1 = 3, p2 = 'a', p3 = 'b'}, 
        new {p1 = 3, p2 = 'c', p3 = 'd'}, 
        new {p1 = 3, p2 = 'e', p3 = 'f'}, 
        new {p1 = 4, p2 = 'a', p3 = 'b'}, 
        new {p1 = 5, p2 = 'a', p3 = 'b'}, 
        new {p1 = 5, p2 = 'c', p3 = 'd'}, 
        new {p1 = 5, p2 = 'e', p3 = 'f'}, 
        new {p1 = 6, p2 = 'a', p3 = 'b'}, 
        new {p1 = 6, p2 = 'e', p3 = 'f'} 


       }; 

    for (int i = 1; i <= 3; i++) 
    { 
     var items = from p in list 
       group p by p.p1 
       into g 
        where g.Count() == i 
        from gi in g 
        select gi; 

     Console.WriteLine(); 
     Console.WriteLine("For " + i); 
     Console.WriteLine(); 
     foreach (var x in items) 
     { 
      Console.WriteLine("{0},{1},{2}", x.p1, x.p2, x.p3); 
     } 

    } 
}