我可以做到这一点没有循环遍历整个列表?查找列表中包含x或y的所有行?
List<string> responseLines = new List<string>();
然后,该列表将填充大约300行文本。
接下来,我想搜索列表并创建以“abc”开头或包含“xyz”的所有行的第二个列表。
我知道我可以为每个做一个,但有没有更好/更快的方式?
我可以做到这一点没有循环遍历整个列表?查找列表中包含x或y的所有行?
List<string> responseLines = new List<string>();
然后,该列表将填充大约300行文本。
接下来,我想搜索列表并创建以“abc”开头或包含“xyz”的所有行的第二个列表。
我知道我可以为每个做一个,但有没有更好/更快的方式?
您可以使用LINQ。这是没有什么不同的性能,明智的使用foreach
- 这几乎是它做什么幕后 - 但你可能喜欢的语法:
var query = responseLines.Where(s => s.StartsWith("abc") || s.Contains("xyz"))
.ToList();
(如果你很高兴与IEnumerable<string>
处理,而不是List<string>
那么你可以忽略最后的ToList
调用)
var newList = (from line in responseLines
where line.StartsWith("abc") || line.Contains("xyz")
select line).ToList();
试试这个:
List<string> responseLines = new List<string>();
List<string> myLines = responseLines.Where(line => line.StartsWith("abc", StringComparison.InvariantCultureIgnoreCase) || line.Contains("xyz")).ToList();
的StartsWith
和Contains
快捷方式 - 如果StartsWith
不满足要求的Contains
只会评估。这仍然遍历整个列表,但当然,如果您想检查整个列表,但无法避免这种情况,但它可以帮您节省
做
输入foreach
。
LINQ可以很好地为您提供改进的语法(参见LukeH的一个很好的例子),但这并不比手工迭代更快。
如果您需要经常执行此操作,您可能想要提供某种索引数据结构,以便在列表中查看所有“abc”或“xyz”字符串,从而可以使用更快的算法可以在询问时提供它们,而不是遍历整个列表。
如果您不必经常这样做,那很可能是“不成熟的优化”。
除非您因为某些原因需要所有文本,否则在生成List
时检查每一行会更快,并放弃不添加它们时不匹配的行。
这取决于List
的加载方式 - 代码未显示。如果您从文本文件中读取数据,这将会很有效,因为您可以直接使用LINQ查询直接对输入数据进行操作,使用File.ReadLines作为源代替最终的List<string>
。
var query = File.ReadLines("input.txt").
Where(s => s.StartsWith("abc") || s.Contains("xyz"))
.ToList();
很简单,没有可能的算法可以保证你永远不必遍历列表中的每个项目。但是,在开始搜索之前,可以改进需要迭代的项目数量 - 对列表进行排序。通过这样做,唯一需要遍历整个列表的时间是只填充“abc”和“xyz”。
假设在您需要搜索时有一个预先排序的列表是不切实际的,那么提高搜索速度的唯一方法就是使用与列表不同的数据结构 - 例如,一个binary search tree。
Linq对于这个东西来说真棒:) – 2010-11-03 23:32:40
如果你保持你的列表排序,那么你可以找到所有以“abc”开头的行,而不必遍历所有行,但是你找不到包含“ xyz“而不看每一个。 – Gabe 2010-11-03 23:46:24