从大列表中提取已过滤的列表

时间:2014-01-08 22:08:32

标签: c# arrays linq

我正试图找出一种通过“File.ReadAllLines(”names.txt“)获取过滤数组的快捷方法;”请求,我有一个包含几千个名字的文本文件,基本上我只需要一个具有以下任何字符的名称列表,我这是一个“选择”语句,添加了一些“OR”条件,所以我的代码是这样的......

var allowedChars = ["v","h","r"];
var allNames = File.ReadAllLines("names.txt");

所以像“大卫”,“约翰”和“拉里”这样的名字就是我所期待的 但是不包括像“peter”,“simon”和“paul”这样的名字

我知道我可以使用foreach来做这个但是想知道是否有一些linq one liner我可以实现这个,而且“allowedChars”数组可能有不同的长度,任何帮助都会很棒。

2 个答案:

答案 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)));