C#循环遍历列表中的项集

时间:2015-02-02 09:24:01

标签: c# list

我有字符串列表,有时列表中有超过10.000.000个字符串。

我需要遍历列表并将这些数据块发送到API,这是每个API调用2k字符串的子列表。

最有效的方法是什么?

3 个答案:

答案 0 :(得分:2)

明智地使用LINQ TakeSkip运算符。

例如语法将如下所示 -

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));

我已经用这个结果进行了一次性能测试:

List.GetRange

00:00:00.0404119 (40 milliseconds)

(我的)GroupBy

00:00:02.2386504 (two seconds)

Skip/Take

00:10:11.6467726 (yes, more than 10 minutes)