c# – 如何使用LINQ在一行中找到与一个谓词匹配的5个元素,但第六个元素不匹配?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何使用LINQ在一行中找到与一个谓词匹配的5个元素,但第六个元素不匹配?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1719字,纯文字阅读大概需要3分钟。
内容图文
![c# – 如何使用LINQ在一行中找到与一个谓词匹配的5个元素,但第六个元素不匹配?](/upload/InfoBanner/zyjiaocheng/784/deae4f1714a34f148f61f7c7a3cc8dd7.jpg)
我正在尝试学习LINQ,似乎找到一系列与谓词匹配的’n’元素应该是可能的,但我似乎无法弄清楚如何解决问题.
我的解决方案实际上需要第二个不同的谓词来测试序列的“结束”,但是在通过测试的至少5个元素的序列之后找到未经过测试的第一个元素也将是有趣的.
这是我天真的非LINQ方法….
int numPassed = 0;
for (int i = 0; i < array.Count - 1; i++ )
{
if (FirstTest(array[i]))
{
numPassed++;
}
else
{
numPassed = 0;
}
if ((numPassed > 5) && SecondTest(array[i + 1]))
{
foundindex = i;
break;
}
}
解决方法:
一个高性能的LINQ解决方案是可能的,但坦率地说非常难看.我们的想法是隔离与描述匹配的子序列(一系列N个项匹配谓词,当谓词找到与第二个谓词匹配时结束),然后选择具有最小长度的第一个.
假设参数是:
var data = new[] { 0, 1, 1, 1, 0, 0, 2, 2, 2, 2, 2 };
Func<int, bool> acceptPredicate = i => i != 0;
// The reverse of acceptPredicate, but could be otherwise
Func<int, bool> rejectPredicate = i => i == 0;
使用GroupBy和一堆丑陋的有状态代码可以隔离子序列(这里是固有的尴尬 – 你必须保持非平凡的状态).我们的想法是按人为和任意的“组号”分组,每当我们从一个可接受的子序列移动到一个绝对不可接受的子序列时,选择一个不同的数字,当反向发生时:
var acceptMode = false;
var groupCount = 0;
var groups = data.GroupBy(i => {
if (acceptMode && rejectPredicate(i)) {
acceptMode = false;
++groupCount;
}
else if (!acceptMode && acceptPredicate(i)) {
acceptMode = true;
++groupCount;
}
return groupCount;
});
最后一步(找到第一组可接受的长度)很容易,但最后一个缺陷是:确保不选择其中一个不满足所述条件的组:
var result = groups.Where(g => !rejectPredicate(g.First()))
.FirstOrDefault(g => g.Count() >= 5);
通过源序列的单次传递实现上述所有操作.
请注意,此代码将接受也结束源序列的一系列项目(即它不会终止,因为我们发现一个项目满足rejectPredicate,但因为我们的数据用完了).如果您不希望这样,则需要稍作修改.
内容总结
以上是互联网集市为您收集整理的c# – 如何使用LINQ在一行中找到与一个谓词匹配的5个元素,但第六个元素不匹配?全部内容,希望文章能够帮你解决c# – 如何使用LINQ在一行中找到与一个谓词匹配的5个元素,但第六个元素不匹配?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。