我正试图找出一种通过“File.ReadAllLines(”names.txt“)获取过滤数组的快捷方法;”请求,我有一个包含几千个名字的文本文件,基本上我只需要一个具有以下任何字符的名称列表,我这是一个“选择”语句,添加了一些“OR”条件,所以我的代码是这样的......
var allowedChars = ["v","h","r"];
var allNames = File.ReadAllLines("names.txt");
所以像“大卫”,“约翰”和“拉里”这样的名字就是我所期待的 但是不包括像“peter”,“simon”和“paul”这样的名字
我知道我可以使用foreach来做这个但是想知道是否有一些linq one liner我可以实现这个,而且“allowedChars”数组可能有不同的长度,任何帮助都会很棒。
答案 0 :(得分:3)
var allowedNames = allNames.Where(n => allowedChars.Any(c => n.IndexOf(c) > -1));
虽然随着文件变大,您可能需要考虑某种数据库解决方案或至少使用
var items = new List<string();
const Int32 BufferSize = 128;
using (var fileStream = File.OpenRead(fileName))
using (var streamReader = new StreamReader(fileStream, Encoding.UTF8, true, BufferSize)) {
String line;
while ((line = streamReader.ReadLine()) != null)
if (allowedChars.Any(c => line.IndexOf(c) > -1))
items.Add(line);
}
因此您不会同时将它们全部加载到内存中。
答案 1 :(得分:1)
以下是一个例子:
var allowedChars = new char[] {'v','h','r'};
var allNames = new string[] { "peter", "paul", "victor", "hans" };
var names = allNames.Where(t => allowedChars.Any(c => t.Contains(c)));