15个boolinq核心操作符详解:从where到groupBy的终极教程
15个boolinq核心操作符详解:从where到groupBy的终极教程
【免费下载链接】boolinqSimplest C++ header-only LINQ template library项目地址: https://gitcode.com/gh_mirrors/bo/boolinq
boolinq是一个极简的C++头文件库,它提供了强大的LINQ风格操作符,让数据处理变得简单高效。作为一个轻量级的模板库,boolinq允许开发者通过直观的链式调用来过滤、转换和聚合数据,极大地提升了C++代码的可读性和开发效率。
一、基础筛选:where与过滤数据 ✨
where操作符是boolinq中最常用的筛选工具,它允许你通过自定义条件过滤集合中的元素。在test/WhereTest.cpp中可以看到其基本用法:
auto dst = rng.where([](int a){return a%2 == 1;}); // 筛选奇数这个简单的lambda表达式筛选出所有奇数,返回一个新的Linq序列。boolinq的where操作符支持任意复杂的条件判断,包括对自定义类型的筛选:
auto dst = rng.where([](const NameAge & a){return a.age < 18;}); // 筛选未成年人二、数据转换:select与映射 ✨
select操作符用于将集合中的每个元素转换为新的类型或值。在test/SelectTest.cpp中展示了如何将整数翻倍:
auto dst = rng.select([](int a){return a * 2;}); // 将每个元素乘以2select的强大之处在于可以进行任意复杂的转换,例如将整数转换为字符:
auto dst = rng.select([](int a){return static_cast<char>('0' + a);}); // 数字转字符三、条件判断:any与all ✨
any和all操作符用于对集合进行条件判断。any检查是否存在满足条件的元素,all则检查是否所有元素都满足条件。
在test/AnyTest.cpp中:
EXPECT_TRUE(rng.any([](int a){return a==1;})); // 是否存在值为1的元素 EXPECT_FALSE(rng.any([](int a){return a==0;})); // 是否不存在值为0的元素而test/AllTest.cpp展示了all的用法:
EXPECT_TRUE(rng.all([](int a){return a>0;})); // 所有元素是否都大于0 EXPECT_FALSE(rng.all([](int a){return a==1;})); // 并非所有元素都是1四、数据聚合:count与sum ✨
count和sum是常用的聚合操作符。count返回元素数量,sum计算元素总和。
在test/CountTest.cpp中:
EXPECT_EQ(3, rng.count()); // 总元素数 EXPECT_EQ(2, rng.count([](int a){return a%2 == 0;})); // 偶数元素数test/SumTest.cpp展示了sum的用法:
auto rng = from(src).sum(); // 计算总和 auto dst0 = rng.where([](int a){return a%2 == 0;}).sum(); // 偶数求和五、元素提取:first与last ✨
first和last操作符用于获取集合中的第一个或最后一个元素,还可以配合条件使用。
在test/FirstTest.cpp中:
EXPECT_EQ(1, from(src).first()); // 获取第一个元素 EXPECT_EQ(2, from(src).first([](int a){return a%2 == 0;})); // 获取第一个偶数test/LastTest.cpp展示了last的用法:
EXPECT_EQ(3, from(src).last()); // 获取最后一个元素 EXPECT_EQ(2, from(src).last([](int a){return a%2 == 0;})); // 获取最后一个偶数六、范围操作:take与skip ✨
take和skip用于处理集合的子集。take(n)获取前n个元素,skip(n)跳过前n个元素。
在test/TakeTest.cpp中:
auto dst = rng.take(3); // 获取前3个元素test/SkipTest.cpp展示了skip的用法:
auto dst = rng.skip(3); // 跳过前3个元素七、排序操作:orderBy ✨
orderBy操作符用于对集合进行排序,可以使用默认排序或自定义排序规则。
在test/OrderByTest.cpp中:
auto dst = rng.orderBy(); // 默认排序 auto dst = rng.orderBy([](std::string a){return a.size();}); // 按字符串长度排序八、分组操作:groupBy ✨
groupBy是boolinq中最强大的操作符之一,它可以根据指定的键对元素进行分组。
在test/GroupByTest.cpp中:
auto dst = from(arr).groupBy([](int a){return a % 3;}); // 按模3结果分组更复杂的用法可以在test/GroupByTestComplex.cpp中找到:
auto dst = from(taxes) .groupBy([](const Tax & a){return a.name;}) .select([](const auto & pair){ return std::make_tuple( pair.first, pair.second.sum([](const Tax & a){return a.amount_1;}), pair.second.sum([](const Tax & a){return a.amount_2;}) ); });九、组合操作:concat、append与prepend ✨
boolinq提供了多种组合集合的方式:concat合并两个集合,append在末尾添加元素,prepend在开头添加元素。
在test/ConcatTest.cpp中:
auto dst = rng1.concat(rng2); // 合并两个集合test/AppendTest.cpp和test/PrependTest.cpp展示了添加元素的方法:
auto rng = from(src).append(4); // 在末尾添加元素 auto rng = from(src).prepend(4); // 在开头添加元素十、其他实用操作符 ✨
distinct:去重
在test/DistinctTest.cpp中:
auto dst = rng.distinct(); // 去除重复元素reverse:反转
在test/ReverseTest.cpp中:
auto dst = rng.reverse(); // 反转集合max与min:最大最小值
在test/MaxTest.cpp和test/MinTest.cpp中:
EXPECT_EQ(3, rng.max()); // 最大值 EXPECT_EQ(1, rng.min()); // 最小值十一、链式操作:组合使用多个操作符 🚀
boolinq的真正强大之处在于可以将多个操作符链式组合,创建复杂的数据处理管道。在test/LinqTest.cpp中可以看到这样的例子:
auto dst = from(src) .where([](int a){return a%2 == 1;}) // 筛选奇数 .where([](int a){return a < 6;}) // 小于6 .select([](int a){return a*2;}) // 翻倍 .orderBy([](int a){return -a;}) // 降序排序 .reverse(); // 反转这种链式调用让代码变得简洁易读,同时功能强大。
十二、如何开始使用boolinq 🚀
要开始使用boolinq,只需包含头文件:
#include <boolinq/boolinq.h> using namespace boolinq;然后就可以对各种容器使用from()函数创建Linq序列:
std::vector<int> vec = {1,2,3,4,5}; auto result = from(vec) .where([](int a){return a%2 == 0;}) .sum();boolinq是一个单头文件库,你可以直接从仓库获取:
git clone https://gitcode.com/gh_mirrors/bo/boolinq总结
boolinq提供了一套完整而强大的LINQ风格操作符,让C++中的数据处理变得简单而高效。通过本文介绍的15个核心操作符,你可以轻松实现筛选、转换、聚合、排序等各种数据处理任务。无论是处理简单的整数列表还是复杂的自定义对象集合,boolinq都能让你的代码更加简洁、可读和高效。
boolinq的所有核心功能都实现在单个头文件include/boolinq/boolinq.h中,这使得集成到任何项目中都非常简单。如果你正在寻找一种方式来简化C++中的数据处理代码,boolinq绝对值得一试!
【免费下载链接】boolinqSimplest C++ header-only LINQ template library项目地址: https://gitcode.com/gh_mirrors/bo/boolinq
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考