2016-10-21 5 views
1

ich folgende Daten als Liste haben:Linq alle Elemente auszuwählen, wo in der Liste mit groupby

raceId data position 
1  A  0 
1  B  0 
1  F  1 
1  J  0 
2  A  2 
2  F  1 
3  A  0 
3  J  2 
3  M  1 
3  V  3 

Ich brauche die Gesamt (count) von Rennen zu bekommen, wo es alle passenden Buchstaben mit der gleichen raceid.

I.E eine Suche auf 'A' und 'J' = 2 (Rennen 1 und 3)

Außerdem muss ich die Positionsdaten für jeden bekommen.

raceId data position 
1  A  0 
1  J  0 
3  A  0 
3  J  2 

Bisher habe ich den folgenden Code.

var dataValues = new string[] { 'A', 'J' }; 

var races = raceData 
    .GroupBy(ac => ac.raceId) 
    .Select(grp => grp.First()) 
    .Where(t => 
     dataValues 
     .All(s => 
      dataValues 
      .Contains(t.data) 
     ) 
    ); 

var racecount = races.count() 

Das Problem ist, dass diese gibt alle raceId Werte, wo es entweder Brief in den Daten vorhanden ist.

+0

Sie brauchen keine 'Gruppe'. Nur 'raceValues.Where (record => dataValues.Contains (record.data));' – Fabio

+0

Wie schreibt man 'raceData', damit wir Ihre Beispielumgebung nicht erstellen müssen. –

Antwort

2

Diese für Sie arbeiten sollten:

var results = raceData.GroupBy(rd => rd.raceId) 
    .Where(g => dataValues.All(dv => g.Select(g2 => g2.data).Contains(dv))); 

int raceCount = results.Count(); 

var results2 = results 
    .SelectMany(g => g) 
    .Where(rd => dataValues.Contains(rd.data)); 

raceCount geben Sie 2 und results2 gibt Ihnen die 4 Datensätze, die Sie erwarten.

Es funktioniert für mich mit Ihren zur Verfügung gestellten Daten trotzdem!

+0

Downvoter Pflege zu erklären? Sie helfen der Site nicht, wenn Sie nicht erklären, warum Sie denken, dass es eine schlechte Antwort ist. – itsme86

+0

Ich habe nicht downvote, aber Sie haben keine Definition für das Ergebnis, um raceCount zu erhalten. – NetMage

+0

Ich bin nicht downvoter: aber _ Zusätzlich muss ich die Positionsdaten für jeden bekommen. Dies macht die Frage unklar. Es scheint, als ob OP Rennen mit Daten in 'dataValues' wollen. Und zählen ist die Menge der Rennen nach dem Filtern – Fabio

-1

die Sie interessieren,

list.GroupBy(t => t.raceID).SelectMany(k => k).Where(x => dataValues.Contains(x.data)) 
.Select(f=> new { f.data ,f.position,f.raceID}).ToList(); 

Ergebnis,

enter image description here

Hoffnung hilft,

+0

Totally Eingabe gebundene Antwort. – eocron

+0

@ eocron06 Lesen Sie die Frage bitte. Es gibt eine Liste von Items, und er erklärte, dass eine Suche nach 'A' und 'J' = 2 (Rasse 1 und 3) _ und auch ein String-Array zum Vergleich vorhanden ist. Wie kann es dynamisch sein, bitte erkläre oder füge eine Antwort hinzu. – Berkay

+1

Ich denke, OP fragte nach dem allgemeinen Prinzip, es zu tun. Wenn Sie denken, dass diese Eingabe konstant ist, dann ist etwas total falsch und Sie können nur die endgültige Antwort geben. – eocron

0
var groupedRaces = from r in raceData 
    group r by r.raceId into gp 
    select new { raceId = gp.Key, Datas = gp.Select(g => g.data).ToArray() }; 

var raceIds = from r in groupedRaces 
    where dataVals.All(mv => r.Datas.Contains(mv)) 
    select r.raceId; 

var races = from r in raceData 
    where raceIds.Contains(r.raceId) && dataVals.Contains(r.data) 
    select r;