2016-07-14 8 views
0

Ich habe eine Liste von Ints, die die richtigen Werte in der richtigen Reihenfolge darstellt. Meine zweite Liste von Ints sind Benutzerwerte, die in der richtigen Reihenfolge oder inkorrekt sein können. Ich möchte diese Listen in eine neue Liste aufnehmen, aber die Reihenfolge der richtigen Liste beibehalten.C# Join zwei int-Listen, wo Werte gleich sind und Werte sind bei gleichem Index

Beispiel:

var correctPositions = _answerActualPositions.Where(x => x != -1); 
var userAnswerPositions = _answerViews.Where(x => x.Answered) 
    .Select(answerView => _answerViews.IndexOf(answerView)); 

Dies sind die Werte:

  1. CorrectPositions [4], [1]
  2. userAnswerPositions [3], [4]

Beide Listen haben das Element 4, aber userAnswerPositions muss 4 bei Element 0 haben, um korrekt zu sein. Also, wenn ich eine Abfrage in C# würde ich erwarten, dass es eine neue Liste aber leer ist.

  1. CorrectPositions [4], [1]
  2. userAnswerPositions [4], [1]

Diese auf der anderen Seite mit einer neuen Abfrage würde 1 Element zurück, weil 4 in derselben ist Element für beide Listen.

Ich bin mir nicht sicher über eine nette Art der Handhabung.

+1

Was ist das gewünschte Ergebnis? Sie möchten alle aus userAnswerPositions auswählen, aber in der Reihenfolge der correctPositions (wenn sie drin ist)? –

+0

@TimSchmelter Ich möchte die beiden Listen in eine 3. Liste einbinden, aber die Ints sind gleich und in der gleichen Position. Ich bin mir nicht sicher, ob ich es überkomplizieren kann. –

+0

Es scheint, dass Sie zwei Liste von Werten konfrontiert werden, um eine Liste von (z. B.) Testantworten durch einen Benutzer mit der Liste der tatsächlichen richtigen Ergebnisse zu überprüfen .. aber wenn es ist, ist es nicht sehr klar, Ihre Vorgehensweise um dieses Problem zu lösen .. Wenn Sie einfach eine Liste nach der anderen anhand der Position ihrer Elemente verifizieren möchten, sollten Sie sie einfach mit einem Join verknüpfen, wie Sie es anhand ihrer Indizes und Werte angeben –

Antwort

1

können Sie Zip verwenden, die durch den Index verbindet:

var resultlist = correctPositions.Zip(userAnswerPositions, 
    (a1, a2) => new { a1, a2 }) // join both into an anonymous type using the index 
    .Where(x => x.a1 == x.a2) // filter out, only same values are allowed 
    .Select(x => x.a2)   // you want a List<int> as result, so select one of both ints(are same anyway) 
    .ToList();     // create the list 
+0

Ok, ich werde es jetzt versuchen. Zip wirkt gleichzeitig auf zwei Listen? –

+0

@nickgowdy: zip benötigt zwei Sequenzen (muss keine Liste sein, könnte ein beliebiger Typ sein, der 'IEnumerable ' wie ein Array implementiert). Es verbindet beide Sequenzen nach Index. Wenn einer mehr enthält als der andere, wird der Teil der längeren Liste ignoriert, also ist es ein zusätzlicher Filter. –

0

Unter der Annahme, CorrectPositions und userAnswerPositions haben die gleiche Größe und dass ich Sie richtig bin zu verstehen, das ist, was Sie nach, nicht wahr?

var result = correctPositions.Select((cp, i) => cp == userAnswerPositions[i] ? cp : (int?) null).ToList(); 

Dies setzt voraus, dass, wenn die Werte auf den beiden Listen nicht übereinstimmen, Sie null haben.

Wenn, wie im Kommentar erläutert, userAnswerPositions kleiner ist, können Sie seine Stellen einfach mit correctPositions im Lambda umkehren.

Auch, wenn Sie nicht über das wollen egal denselben Index in der Folge beibehalten und nur die Elemente zurück, die den gleichen Wert und Indizes in beiden Listen haben könnten Sie einfach tun:

var result = userAnswerPositions.Where((uap, i) => uap == correctPositions[i]).ToList(); 
+0

Es wird eine Ausnahme ausgelöst, wenn eine Liste größer ist als die andere. Gibt eine 'List ' zurück, während OP eine 'List ' will. –

+0

Es ist möglich, dass userAnswerPositions eine kleinere Anzahl hat, so dass es behandelt werden müsste. –

+0

Meine schlechte für assumming beide Listen werden die gleiche Größe haben, wenn userAnswerPositions die kleinste ist, können Sie einfach correctPositions und userAnswerPositions umkehren: 'var result = userAnswerPositions.Select ((uap, i) => uap == correctPositions [i]? uap: (int?) null) .ToList(); '. es gibt eine Liste von Nullable-Ints zurück, weil ich, wie ich sagte, das op will null als Wert im Index, wo die Werte nicht gleich sind, kann dies leicht zu -1 oder einer anderen magischen Zahl geändert werden, wenn das Op ein will Liste von Ints. – Pablo

Verwandte Themen