我可以不循环遍历整个列表吗?
List<string> responseLines = new List<string>();
然后该列表将填充大约300行文本。
接下来我想搜索列表并创建第二个列表,其中包含以“abc”开头或包含“xyz”的所有行。
我知道我可以为每个人做一个但是有更好/更快的方式吗?
答案 0 :(得分:7)
您可以使用LINQ。这与使用foreach
的性能没有什么不同 - 这几乎就是它在幕后的作用 - 但您可能更喜欢语法:
var query = responseLines.Where(s => s.StartsWith("abc") || s.Contains("xyz"))
.ToList();
(如果您对使用IEnumerable<string>
而不是List<string>
感到满意,那么您可以省略最后的ToList
来电。)
答案 1 :(得分:4)
var newList = (from line in responseLines
where line.StartsWith("abc") || line.Contains("xyz")
select line).ToList();
答案 2 :(得分:4)
试试这个:
List<string> responseLines = new List<string>();
List<string> myLines = responseLines.Where(line => line.StartsWith("abc", StringComparison.InvariantCultureIgnoreCase) || line.Contains("xyz")).ToList();
StartsWith
和Contains
快捷方式 - Contains
仅评估StartsWith
是否不满意。这仍然会迭代整个列表,但是如果你想检查整个列表,当然没有办法避免这种情况,但它可以让你免于做输入foreach
。
答案 3 :(得分:3)
使用LINQ:
List<string> list = responseLines.Where(x => x.StartsWith("abc") || x.Contains("xyz")).ToList();
答案 4 :(得分:2)
除非您出于某种原因需要所有文本,否则在生成List
时检查每一行会更快,并且在不添加它们的情况下丢弃那些不匹配的行。
这取决于List
的加载方式 - 代码未显示。如果您从文本文件中读取,这将是有效的,因为您可以使用您的LINQ查询直接在输入数据上使用File.ReadLines作为源而不是最终List<string>
。
var query = File.ReadLines("input.txt").
Where(s => s.StartsWith("abc") || s.Contains("xyz"))
.ToList();
答案 5 :(得分:1)
LINQ在为这种事情提供改进的语法方面效果很好(参见LukeH的一个好例子的答案),但它并不比手动迭代更快。
如果您需要经常执行此操作,您可能想要提供某种索引数据结构,在它们进入列表时监视所有“abc”或“xyz”字符串,从而可以更快地使用在被问到时提供服务的算法,而不是遍历整个列表。
如果您不必经常这样做,那可能是“过早优化”。
答案 6 :(得分:1)
很简单,没有可能的算法可以保证您永远不必迭代列表中的每个项目。但是,可以改进需要迭代的项目的平均数量 - 在开始搜索之前对列表进行排序。通过这样做,你必须遍历整个列表的唯一时间是它只填充“abc”和“xyz”。
假设您需要搜索预先排序的列表是不切实际的,那么提高搜索速度的唯一方法是使用与列表不同的数据结构 - 例如,binary search tree。