2012-04-13 39 views
0

我有一组需要某些处理的数据,但我想拆分可用的线程。我怎样才能把它变成单个指令,最好是去除for循环?将For-loop Linq查询重构为单个查询

string[] keysForThread; 
IEnumerable<string> allData; 
List<string> dataForSingleThreadToProcess; 

for (int i = 0; i < keys.length; i++) 
    dataForSingleThreadToProcess.AddRange(allData.Where(x => x.StartsWith(keys[i]))); 

我不介意改变的String [] keysForThread成列表和/或列表dataForSingleThreadToProcessinto一个IEnumerable。

回答

1

这听起来像你想:

var data = allData.Where(datum => keys.Any(key => datum.StartsWith(key)) 
        .ToList(); 
+0

或'伯爵(键=> datum.StartsWith(钥匙)> 0)'对于那些仍然在.NET 3.5 :) – mattytommo 2012-04-13 10:09:42

+0

@mattytommo:为什么呢? '任何'在.NET 3.5中...... – 2012-04-13 10:26:32

+0

这是?我的错。我怪这是星期五的事实:) – mattytommo 2012-04-13 10:29:05

0

这是在做你的代码做什么,而不for循环的直接方式。

var data = keys.SelectMany(k => allData.Where(d => d.StartsWith(k)).ToList(); 

但是,乔恩斯威特的答案可能会更有效。

+0

也就是说,这个答案将导致在相同的顺序作为您的原始代码相同的项目(我认为),其中JS将导致不同的顺序和任何重复项(由例如键'bo'和'b'由两个匹配'书')被删除。 – Rawling 2012-04-13 10:02:17

+0

非常有帮助,谢谢。 – user1250122 2012-04-13 10:37:53

0

这应该做的工作:

dataForSingleThreadToProcess = allData.Where(x => keys.Any(x.StartsWith)).ToList(); 
+0

在写这篇文章时,我不是唯一一个有这个想法的人:) – MatthiasG 2012-04-13 10:03:18

+0

非常有帮助,谢谢。 – user1250122 2012-04-13 10:38:03