[英]Which way to get indices of collection items meeting a condition is better?
假设我有一个字符串集合。
List<string> lines = new List<string>(File.ReadAllLines("Test.txt"));
并使用正则表达式搜索该集合中的匹配项:
Regex r = new Regex(@"some regular expression");
如何获得与正则表达式匹配的元素的indeces?
我有三个想法。
第一名:
var indeces1 = lines.Where(l => r.IsMatch(l))
.Select(l => lines.IndexOf(l));
foreach (int i in indeces1)
{
Console.WriteLine(i);//Do the index-based task instead...
}
我不喜欢它,使用IndexOf
而不是原始集合。 我错了,没关系?
var indeces2 = lines.Select((l, i) => new { Line = l, Index = i })
.Where(o => r.IsMatch(o.Line));
foreach (var o in indeces2)
{
Console.WriteLine(o.Index);//Do the index-based task instead...
}
它似乎比第一个更好,但有没有办法在不创建匿名对象的情况下做同样的事情?
最后一个:
for (int i = 0; i < lines.Count; i++)
{
if (r.IsMatch(lines[i]))
{
Console.WriteLine(i);//Do the index-based task instead...
}
}
其实我现在有这个工作。 但是,由于我喜欢LINQ,我希望有一种LINQ方式来做同样的事情。
那么有更好的LINQ方式来完成这个简单的任务吗?
如果你喜欢LINQ,你可以使用Enumerable.Range更简单:
var indexes = Enumerable.Range(0, lines.Count)
.Where(i => r.IsMatch(lines[i]));
编辑:
而不是使用File.ReadAllLines
将所有行都放入内存:
List<string> lines = new List<string>(File.ReadAllLines("Test.txt"));
如果您的文件很大,您应该考虑使用延迟执行的ReadLines
以提高效率:
var lines = File.ReadLines("C:\\Test.txt"));
如果你只需要索引,那你为什么不试试。选择(t => t.Index); 在你的选项2. (最后)只获得IEnumerable索引。 你将摆脱Anonymous对象。
所以你的查询将是:
var indeces2 = lines.Select((l, i) => new { Line = l, Index = i })
.Where(o => r.IsMatch(o.Line))
.Select(t => t.Index);
在这种情况下,我会使用你简陋的迭代器版本:
for (int i = 0; i < lines.Count; i++)
{
if (r.IsMatch(lines[i]))
{
Console.WriteLine(i);//Do the index-based task instead...
}
}
对于这种情况,LINQ并没有真正减少行数并增加可读性,与选项3相比。所以我会选择最简单的版本。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.