2017-01-03 2 views
0

Я - кто-то, кто не знаком с Qt. У меня есть сомнение, как условно перебирать QList.QList Итерация с использованием условий

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

QList<Data> myList; 

И у меня есть список, как это:

List Preview

Я хочу, чтобы получить элементы списка, где Feature="F1" и Result="pass" мне нужно, чтобы получить кол-ID в особенности 1. Удаление дубликатов.

Я знаком с LINQ и C# List и его достижимо в одной строке кода на C#. Но с QList я немного смущен.

+0

вам нужно число значений «ID», которые соответствуют критериям, или делать как часто каждый идентификатор встречается в матчах? I.e. вам нужен вывод '1' (только Id1 соответствует критериям) или карту типа' [Id1 -> 3] '(Id1 соответствует критериям 3 раза) –

ответ

1

Прежде всего, вы не должны использовать QList, а скорее QVector, так как это больше efficient в большинстве случаев. Если вам не нужен QList, потому что вы взаимодействуете с Qt API, который его ожидает, конечно. Даже тогда, хотя QVector::toList, вероятно, было бы лучше.

Что касается вашей проблемы, это может быть один вкладыш в C++, а также:

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"; }); 

Печать 3.

Требуется C++ 11 для лямбда, но count_if сам не делает.

Чтобы перечислить все уникальные идентификаторы, которые удовлетворяют условию она все еще может быть один вкладыш, но она начинает запутаться:

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

В вашем вопросе говорится, что вы начинаете использовать Qt, поэтому попросите ответ, чтобы узнать, как использовать QList. – eyllanesc

+0

@eyllanesc Код будет идентичным для 'QList', поэтому я не понимаю ваш нисходящий или комментарий. Кроме того, ОП не утверждал, что он учится использовать 'QList', но что он использует его, скорее всего, потому что он исходит из C#, где« List »является контейнером по умолчанию. Я просто указал, что его нельзя считать дефолтом в Qt. – Resurrection

+0

Он говорит: «Но в QList я немного смущен» и «Я - кто-то, кто не знаком с QT» – eyllanesc

Смежные вопросы