c#
  • string
  • 2017-04-25 200 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); 
    
    相關問題