2017-01-03 9 views
0

Ich bin jemand, der neu in Qt ist. Ich habe Zweifel, wie man über eine QList bedingt iterieren kann.QList Iteration mit Bedingungen

struct Data 
{ 
    QString Feature; 
    QString Id; 
    QString Result; 
}; 

QList<Data> myList; 

Und ich habe die Liste wie folgt aus:

List Preview

Ich möchte die Elemente der Liste bekommen, wo Feature="F1" und Result="pass" Ich brauche die Anzahl der ID in Funktion 1 zu erhalten. Entfernen von Duplikaten

Ich bin vertraut mit LINQ und C# List und es ist in einer einzigen Zeile von Code in C# erreichbar. Aber mit QList bin ich ein bisschen verwirrt.

+0

Haben Sie die Anzahl der „id“ Werte brauchen, die den Kriterien entsprechen, oder Wie oft kommt jede ID in den Matches vor? I.e. brauchen Sie die Ausgabe, um '1' zu sein (nur Id1 entspricht den Kriterien) oder eine Karte wie' [Id1 -> 3] '(Id1 entspricht den Kriterien 3 mal) –

Antwort

1

Zuerst sollten Sie nicht QList sondern QVector verwenden, da es in den meisten Fällen mehr efficient ist. Es sei denn, Sie benötigen QList, weil Sie mit der Qt API, die es natürlich erwartet, interagieren. Auch dann wäre QVector::toList wahrscheinlich besser.

QVector<Data> data{{"F1", "Id1", "Pass"}, //or QList<Data> if you really insist... 
        {"F1", "Id1", "Pass"}, 
        {"F1", "Id1", "Pass"}, 
        {"F1", "Id2", "Fail"}, 
        {"F1", "Id2", "Fail"}, 
        {"F3", "Id3", "Pass"}, 
        {"F3", "Id3", "Pass"}, 
        {"F2", "Id4", "Pass"}, 
        {"F2", "Id4", "Pass"}}; 

qDebug() << std::count_if(data.cbegin(), 
          data.cend(), 
          [](const Data &data) { return data.Feature == "F1" && data.Result == "Pass"; }); 

Druck 3.

Benötigt C++ 11 für das Lambda aber count_if selbst nicht:

Wie für Ihr Problem, kann es auch one-liner in C++ sein.

Um alle eindeutigen IDs auflisten, die die Bedingung erfüllen, es noch ein Einzeiler sein könnte, aber es beginnt chaotisch zu bekommen:

QVector<Data> result; 
std::copy_if(data.cbegin(), 
      data.cend(), 
      std::back_inserter(result), 
      [&result](const Data &data) 
      { 
       return std::find_if(result.cbegin(), result.cend(), [&data](const Data &d) { return d.Id == data.Id; }) == result.cend() 
         && data.Feature == "F1" 
         && data.Result == "Pass"; 
      }); 
qDebug() << result.count(); 
+0

In Ihrer Frage sagt, dass Sie beginnen, Qt zu verwenden, Fragen Sie die Antwort, um zu erfahren, wie Sie QList verwenden. – eyllanesc

+0

@eyllanesc Der Code wäre für 'QList' identisch, daher verstehe ich Ihren Kommentar nicht. Außerdem hat das OP nicht angegeben, dass er lernt, 'QList' zu verwenden, sondern dass er es benutzt, wahrscheinlich weil er aus C# kommt, wo' List' ein Standard-Container ist. Ich habe lediglich darauf hingewiesen, dass es in Qt nicht als Standard betrachtet werden sollte. – Resurrection

+0

Er sagt: "Aber in QList bin ich etwas verwirrt" und "Ich bin jemand, der QT neu ist" – eyllanesc