c#
  • string
  • 2017-04-25 222 views -2 likes 
    -2

    的名单我有一个字符串,它是28000线长,并奠定了象下面这样:字符串分割到字符串

    List<string> sQuerys = new List<string>(); 
    
    string FullFileQuery = " EXEC spDataCache_INS_XSCDV1P @Company = 'UKC        ', @Country = 'AE         ', @Trade_Lane = 'ARABIAN GULF/MIDDLE EAST   ', @Trade_Region = 'INDIA/PAKISTAN/MIDDLE EAST   ' 
    EXEC spDataCache_INS_XSCDV1P @Company = 'UKC        ', @Country = 'AL         ', @Trade_Lane = 'MEDITERRANEAN      ', @Trade_Region = 'EUROPE/MEDITERRANEAN    ' 
    EXEC spDataCache_INS_XSCDV1P @Company = 'UKC        ', @Country = 'AO         ', @Trade_Lane = 'WEST AFRICA      ', @Trade_Region = 'AFRICA        ' 
    EXEC spDataCache_INS_XSCDV1P @Company = 'UKC        ', @Country = 'AR         ', @Trade_Lane = 'EAST COAST SOUTH AMERICA   ', @Trade_Region = 'LATIN AMERICA      ' 
    EXEC spDataCache_INS_XSCDV1P @Company = 'UKC        ', @Country = 'AU         ', @Trade_Lane = 'AUSTRALIA/NEW ZEALAND    ', @Trade_Region = 'FAR EAST AND OCEANIA    '" 
    

    我要拆分的字符串中的每个第一万五千线,并添加到我的字符串sQuerys的名单。

    因此,28000行将被拆分成15000行和13000行并添加到列表中。我无法确定实现这一目标的最快途径。

    编辑:

    的代码,我试图这样做,但我坚持低于:

    if (FullFileQuery.Split('\n').Length > 15000) 
    { 
        //28000 
        int numLines = FullFileQuery.Split('\n').Length; 
        //LOOP TWICE. 
        for (int i = 0; i < ((numLines/15000) + 1); i++) 
        { 
         //NEED TO ADD TO sQuerys in here. 
        } 
    } 
    
    +0

    有点不清楚。这是来自一个文件吗?您将15k和13k行添加到什么样的列表? “最快”的定义是什么 - 最高性能或最少代码? – stuartd

    +0

    你自己试过什么吗?请使用您尝试的代码编辑您的文章,然后我们将/可以帮助您。 SO不是代码写作服务! – Torben

    +0

    @stuartd对不起,不清楚。我试图编辑我的问题。我想添加到列表和最高的性能,因为可能有20万行,我必须分成15000行的块。 –

    回答

    0

    您可以使用SkipTake LINQ的方法做这样的事情:

    int chunkSize = 15000; 
    var splitted = FullFileQuery.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); 
    int chunks=splitted.Length/chunkSize; //Get number of chunks 
    
    for (int i=0;i<chunks;i++) 
    {     
        sQuerys.Add(string.Join(Environment.NewLine,splitted 
              .Skip(i * chunkSize) //skip the already added lines 
              .Take(chunkSize))); //take the new lines 
    } 
    

    所以基本上我们首先将所有行分成splitted。然后我们将分割数组的长度除以我们想要得到的块的大小。最后,我们首先使用Skip来循环这些数量的块,以便将我们已经添加到前面的块中的行“跳转”,然后Take接收块。

    还没有尝试过,所以评论如果有什么不工作。

    0

    您可以使用类似

    class Program 
    { 
        static void Main(string[] args) 
        { 
         var input = @"your long multiline string..."; 
    
         var list = new List<string>(); 
         var lines = input.Split('\n'); 
         var index = 0; 
         var batchSize = 15000; 
         while (index < lines.Count()) 
         { 
          list.Add(string.Join(string.Empty, lines.Skip(index).Take(batchSize))); 
          index += batchSize; 
         } 
        } 
    } 
    
    0

    这个扩展方法批次中的任何类型的列表成批的IEnumerable

    public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> source, int batchSize) 
    { 
        var batch = new List<T>(batchSize); 
    
        foreach (var item in source) 
        { 
         batch.Add(item); 
    
         if (batch.Count == batchSize) 
         { 
          yield return batch; 
          batch = new List<T>(batchSize); 
         } 
        } 
    
        if (batch.Any()) 
        { 
         yield return batch; 
        } 
    } 
    

    您可以使用它像这样:

    var batchesOfLines = allLines.Batch(15000); 
    
    相关问题