我有字符串列表,有时列表中有超过10.000.000个字符串。
我需要遍历列表并将这些数据块发送到API,这是每个API调用2k字符串的子列表。
最有效的方法是什么?
答案 0 :(得分:2)
例如语法将如下所示 -
IEnumerable<resultStrings> page1 = myStrings.Skip(0).Take(2000);
IEnumerable<resultStrings> page2 = myStrings.Skip(2000).Take(2000);
答案 1 :(得分:1)
尝试GetRange方法:
List<int> list = new List<int>() { 1, 2, 3, 4, 5};
var chunk = 2;
var iterations = list.Count / chunk;
for (int i = 0; i < iterations; i++)
{
var portion = list.GetRange(chunk * i, chunk);
//Do API
}
var remainder = list.GetRange(chunk * iterations, list.Count - chunk * iterations);
//Do API
您可以在GetRange获胜的GetRange vs Take上查看一些基准测试。 https://icodeit.wordpress.com/2012/08/27/performance-of-skip-and-take-in-linq-to-objects/
答案 2 :(得分:0)
最有效的方法可能是使用数据库而不是将所有内容加载到内存中(从任何地方加载),然后使用Skip
/ Take
来获取部分内容。
但是,您可以使用GroupBy
:
var chunks = largeStringList.Select((str, index) => new { str, index })
.GroupBy(x => x.index / 2000, x => x.str);
foreach (var chunkGroup in chunks)
Console.WriteLine(String.Join(",", chunkGroup));
我已经用这个结果进行了一次性能测试:
00:00:00.0404119 (40 milliseconds)
(我的)GroupBy
:
00:00:02.2386504 (two seconds)
00:10:11.6467726 (yes, more than 10 minutes)