为什么过滤器不适用于字符串列表
Why filter not working on list of strings
我正在尝试编写代码来读取文本文件并过滤掉包含两个搜索项的行:
import std.stdio;
import std.string;
import std.file : readText;
import std.algorithm;
void main(){
string[] srchitems = ["second", "pen"]; // to search file text for lines which have both these;
auto alltext = readText("testing.txt");
auto alllist = alltext.split("\n");
foreach(str; srchitems){
alllist = alllist.filter!(a => a.indexOf(str) >= 0); // not working ;
}
writeln(alllist);
}
但是,它不起作用并出现此错误:
$ rdmd soq_filter.d
soq_filter.d(11): Error: cannot implicitly convert expression filter(alllist) of type FilterResult!(__lambda1, string[]) to string[]
Failed: ["/usr/bin/dmd", "-v", "-o-", "soq_filter.d", "-I."]
以下带有强制转换的行也不起作用:
alllist = cast(string[]) alllist.filter!(a => a.indexOf(str) >= 0); // not working ;
错误:
Error: cannot cast expression filter(alllist) of type FilterResult!(__lambda1, string[]) to string[]
问题出在哪里,如何解决?谢谢
如您所知,filter
中的 return 值不是数组,而是自定义范围。 filter
的 return 值实际上是一个惰性范围,因此如果您只使用前几项,则只会计算那些项目。要将惰性范围转换为数组,您需要使用 std.array.array
:
import std.array : array;
alllist = alllist.filter!(a => a.indexOf(str) >= 0).array;
在你的情况下,这似乎很有效。然而,通过稍微重构你的代码,有一个更惯用的解决方案:
import std.stdio;
import std.string;
import std.file : readText;
import std.algorithm;
import std.array;
void main() {
string[] srchitems = ["second", "pen"];
auto alltext = readText("testing.txt");
auto alllist = alltext.split("\n");
auto results = alllist.filter!(a => srchitems.any!(b => a.indexOf(b) >= 0));
writeln(results);
}
在上面的代码中,我们直接使用filter
的结果,而不是将其转换为数组。
我正在尝试编写代码来读取文本文件并过滤掉包含两个搜索项的行:
import std.stdio;
import std.string;
import std.file : readText;
import std.algorithm;
void main(){
string[] srchitems = ["second", "pen"]; // to search file text for lines which have both these;
auto alltext = readText("testing.txt");
auto alllist = alltext.split("\n");
foreach(str; srchitems){
alllist = alllist.filter!(a => a.indexOf(str) >= 0); // not working ;
}
writeln(alllist);
}
但是,它不起作用并出现此错误:
$ rdmd soq_filter.d
soq_filter.d(11): Error: cannot implicitly convert expression filter(alllist) of type FilterResult!(__lambda1, string[]) to string[]
Failed: ["/usr/bin/dmd", "-v", "-o-", "soq_filter.d", "-I."]
以下带有强制转换的行也不起作用:
alllist = cast(string[]) alllist.filter!(a => a.indexOf(str) >= 0); // not working ;
错误:
Error: cannot cast expression filter(alllist) of type FilterResult!(__lambda1, string[]) to string[]
问题出在哪里,如何解决?谢谢
如您所知,filter
中的 return 值不是数组,而是自定义范围。 filter
的 return 值实际上是一个惰性范围,因此如果您只使用前几项,则只会计算那些项目。要将惰性范围转换为数组,您需要使用 std.array.array
:
import std.array : array;
alllist = alllist.filter!(a => a.indexOf(str) >= 0).array;
在你的情况下,这似乎很有效。然而,通过稍微重构你的代码,有一个更惯用的解决方案:
import std.stdio;
import std.string;
import std.file : readText;
import std.algorithm;
import std.array;
void main() {
string[] srchitems = ["second", "pen"];
auto alltext = readText("testing.txt");
auto alllist = alltext.split("\n");
auto results = alllist.filter!(a => srchitems.any!(b => a.indexOf(b) >= 0));
writeln(results);
}
在上面的代码中,我们直接使用filter
的结果,而不是将其转换为数组。