使用LINQ重写代码

Max*_*Max 1 c# linq

这是我使用的代码的简化版本.我需要使用LINQ重写它.

class Program
{
    // Here is the ugly stuff
    static void DoStuff(int[] uidArray)
    {
        int chunkCount = (int)Math.Ceiling(uidArray.Length / 10d);

        for (int i = 0; i < chunkCount; i++)
        {
            // calculating the remaining uids.
            // this is super ugly imho, but I couldnt come up with anything better...
            int remaining = (i == chunkCount - 1) ? uidArray.Length - i * 10 : 10;

            int[] currentChunks = uidArray.Skip(i * 10).Take(remaining).ToArray();
            string[] data = GetDataForUids(currentChunks);

            foreach (string item in data)
            {
                Console.WriteLine(item);
            }
        }
    }

    // Call DoStuff()
    static void Main(string[] args)
    {
        DoStuff(Enumerable.Range(1, 21).ToArray());
        Console.ReadLine();
    }

    // This method does is not my concern
    static string[] GetDataForUids(int[] uidArray)
    {
        var ret = new List<string>();

        foreach (int uid in uidArray)
        {
            ret.Add("item " + uid);
        }

        return ret.ToArray();
    }
}
Run Code Online (Sandbox Code Playgroud)

"真实"实施的作用是什么:

  • 采取int[]一些uids
  • 将它们分成较小的阵列,每个部分最多10个uid
  • 在for循环中参与部分
  • 对于每个GetDataForUids使用数据库的部分调用,以便通过uid获取数据
  • foreach循环中处理返回的数据

由于各种"外部"变量,chunkCount我无法想象如何使用LINQ以更好的方式编写这个东西.还有可能吗?

Dar*_*rov 6

你去:

class Program
{
    static void Main(string[] args)
    {
        var uids = Enumerable.Range(1, 21).ToArray();
        var chunks = from index in Enumerable.Range(0, uids.Length)
                     group uids[index] by index / 10;

        foreach (var currentChunks in chunks)
        {
            Console.WriteLine("KEY: {0}", currentChunks.Key);
            // TODO: string[] data = GetDataForUids(currentChunks.ToArray());
            foreach (var uid in currentChunks)
            {
                Console.WriteLine(uid);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

打印:

KEY: 0
1
2
3
4
5
6
7
8
9
10
KEY: 1
11
12
13
14
15
16
17
18
19
20
KEY: 2
21
Run Code Online (Sandbox Code Playgroud)