0

10000 個の値を含む配列があり、配列から 50 個の項目を取得して、いくつかの文字列操作を実行したいと考えています。LINQ または FOR ループを使用してどうすればよいですか。前もって感謝します。

4

6 に答える 6

2

次のように、ループ内でSkipandを使用できます。Takefor

for (int pos = 0 ; pos < values.Length ; pos += 50) {
    var subArray = values.Skip(pos).Take(50).ToArray();
}

注: がvalues配列またはList<String>.

ただし、これは最も効率的な方法ではありません。LINQ をまったく使用せず、Array.Copy代わりにメソッドを使用する方がよいでしょう。

var subArray = new String[50];
for (int pos = 0 ; pos < values.Length ; pos += 50) {
    Array.Copy(values, pos, subArray, 0, 50);
}

上記のソリューションではsubArray、実行する予定の処理の一部として保存されず、values.Length50 で割り切れる (10000 アイテムの場合) 必要があります。

于 2013-11-12T17:17:34.933 に答える
1

あなたはただ使うことができますGetRange

       List<string> elements  = yourArray.ToList();
       if (null != elements && elements.Count > 50)
        {
            for (int i = 0; i < elements.Count; i += 50)
            {
                Array result = elements.GetRange(i,50).ToArray();
                // here you can pass the retrived list to your private method to do the necessary functionility. 
                StringOperationForArray(result);
            }
        }
于 2013-11-12T17:36:30.100 に答える
0

どうぞ:

using System;
using System.Collections.Generic;
using System.Linq; 

namespace ConsoleApplication2
{
    class Program
    {
        const int chunkSize = 50;
        static void Main(string[] args)
        {
            var bigList = Enumerable.Range(0, 10000).Select(s => s.ToString()).ToList();

            ChunkerProcess(bigList, i => { Console.WriteLine(i); });
        }

        private static void ChunkerProcess<T>(List<T> bigList, Action<T> action )
        {
            int pointer = 0;
            List<T> chunks = bigList.GetRange(0, chunkSize>bigList.Count?bigList.Count:chunkSize);
            while (chunks.Count > 0)
            {
                foreach (var chunk in chunks)
                {
                    action.Invoke(chunk);
                }
                chunks.Clear();
                if (chunkSize * pointer < bigList.Count)
                {
                    chunks = bigList.GetRange(chunkSize * pointer, chunkSize * (pointer + 1) > bigList.Count ? bigList.Count - chunkSize * pointer : chunkSize);
                    pointer++;
                }
            }
        }
    }
}
于 2013-11-12T17:30:51.867 に答える