我是Qt的新手。我怀疑如何有条件地迭代QList
。
struct Data
{
QString Feature;
QString Id;
QString Result;
};
QList<Data> myList;
我有这样的清单:
我想获取列表中Feature="F1"
和Result="pass"
的项目
我需要在功能1中获取ID计数。删除重复项。
我熟悉LINQ和C#List
,并且可以在C#的单行代码中实现。但是对于QList
我有点困惑。
答案 0 :(得分: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。
lambda需要C ++ 11,但count_if
本身不需要。
要列出满足条件的所有唯一ID,它仍然可以是单行,但它开始变得混乱:
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();