2010-11-03 38 views
3

我可以做到这一点没有循环遍历整个列表?查找列表中包含x或y的所有行?

List<string> responseLines = new List<string>(); 

然后,该列表将填充大约300行文本。

接下来,我想搜索列表并创建以“abc”开头或包含“xyz”的所有行的第二个列表。

我知道我可以为每个做一个,但有没有更好/更快的方式?

+2

Linq对于这个东西来说真棒:) – 2010-11-03 23:32:40

+1

如果你保持你的列表排序,那么你可以找到所有以“abc”开头的行,而不必遍历所有行,但是你找不到包含“ xyz“而不看每一个。 – Gabe 2010-11-03 23:46:24

回答

7

您可以使用LINQ。这是没有什么不同的性能,明智的使用foreach - 这几乎是它做什么幕后 - 但你可能喜欢的语法:

var query = responseLines.Where(s => s.StartsWith("abc") || s.Contains("xyz")) 
         .ToList(); 

(如果你很高兴与IEnumerable<string>处理,而不是List<string>那么你可以忽略最后的ToList调用)

+1

请注意,这仍然遍及整个列表,您不必自己编写'foreach'。 – Gabe 2010-11-03 23:35:04

+0

仅供参考 - 'Contains'应该是“xyz” – Phil 2010-11-03 23:36:01

+0

这反复遍历每行中的每个字符。 – Svisstack 2010-11-03 23:36:25

3

使用LINQ:

List<string> list = responseLines.Where(x => x.StartsWith("abc") || x.Contains("xyz")).ToList(); 
+0

这样迭代每行中的每个字符。 – Svisstack 2010-11-03 23:37:12

+3

+1抵消Svisstack。 – Inisheer 2010-11-03 23:38:53

4
var newList = (from line in responseLines 
       where line.StartsWith("abc") || line.Contains("xyz") 
       select line).ToList(); 
+0

这对每行中的每个字符进行迭代。 – Svisstack 2010-11-03 23:36:48

+0

对投票表示好奇。 – Inisheer 2010-11-03 23:36:50

+3

@Svisstack:我们听到了你;你不需要冷静地回答每个答案并重复自己。此外,你的错误表现是:你的答案正确地解决了这个问题,所以根据常见问题没有显示降低表决的情况。 – CesarGon 2010-11-03 23:39:20

4

试试这个:

List<string> responseLines = new List<string>(); 
List<string> myLines = responseLines.Where(line => line.StartsWith("abc", StringComparison.InvariantCultureIgnoreCase) || line.Contains("xyz")).ToList(); 

StartsWithContains快捷方式 - 如果StartsWith不满足要求的Contains只会评估。这仍然遍历整个列表,但当然,如果您想检查整个列表,但无法避免这种情况,但它可以帮您节省 输入foreach

+0

这对每行中的每个字符进行迭代。 – Svisstack 2010-11-03 23:38:01

+4

+1抵消Svisstack。 – Inisheer 2010-11-03 23:39:38

+0

@Svisstack - 当你做一个Contains时,很难避免这样做,你可以做的最好的事情就是避免Contains,如果由于首先遇到另一个条件而不需要该行。至少我们让任何内置于LINQ的智能进行角色迭代。我没有看到你提出了一个避免这个问题的解决方案? – slugster 2010-11-03 23:42:29

1

LINQ可以很好地为您提供改进的语法(参见LukeH的一个很好的例子),但这并不比手工迭代更快。

如果您需要经常执行此操作,您可能想要提供某种索引数据结构,以便在列表中查看所有“abc”或“xyz”字符串,从而可以使用更快的算法可以在询问时提供它们,而不是遍历整个列表。

如果您不必经常这样做,那很可能是“不成熟的优化”。

2

除非您因为某些原因需要所有文本,否则在生成List时检查每一行会更快,并放弃不添加它们时不匹配的行。

这取决于List的加载方式 - 代码未显示。如果您从文本文件中读取数据,这将会很有效,因为您可以直接使用LINQ查询直接对输入数据进行操作,使用File.ReadLines作为源代替最终的List<string>

var query = File.ReadLines("input.txt"). 
     Where(s => s.StartsWith("abc") || s.Contains("xyz")) 
     .ToList(); 
1

很简单,没有可能的算法可以保证你永远不必遍历列表中的每个项目。但是,在开始搜索之前,可以改进需要迭代的项目数量 - 对列表进行排序。通过这样做,唯一需要遍历整个列表的时间是只填充“abc”和“xyz”。

假设在您需要搜索时有一个预先排序的列表是不切实际的,那么提高搜索速度的唯一方法就是使用与列表不同的数据结构 - 例如,一个binary search tree

相关问题