2009-11-07 48 views
1

这是我使用的代码的简化版本。我需要用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(); 
    } 
} 

什么“真正”实现执行:

  • 服用的UID
  • 将它们划分在较小的阵列,最多10 UID的每个部分的int[]
  • 在for循环回吐零件零件号
  • 为每个部分调用GetDataForUids它使用数据库为了通过uid获取数据
  • 个过程中foreach循环

因为各种“外部”变量,如chunkCount我怎么也想不到这个东西可以使用LINQ更好的方式来写的返回的数据。它仍然有可能吗?

回答

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

打印:

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 
+0

+1,必须承认,用在这里分组是一个漂亮的解决方案。 – driis 2009-11-07 11:24:09

0

如何:

static void DoStuff(int[] uidArray) 
{ 
    const int length = 10; 
    int n = uidArray.Length/length; 
    n += n%length == 0 ? 0 : 1; 
    IEnumerable<int> parts = uidArray; 
    for (int i = 0; i < n; i++) 
    { 
     int[] currentChunks = parts.Take(length).ToArray(); 
     string[] data = GetDataForUids(currentChunks); 
     parts = parts.Skip(length); 
     foreach (string item in data) 
     { 
      Console.WriteLine(item); 
     } 
    } 
} 

这工作,因为采取将最多n个元素,而是返回一个较小的序列如果没有更多的元素。

稍微漂亮的版本:

static void DoStuff(int[] uidArray) 
{ 
    const int length = 10; 
    IEnumerable<int> parts = uidArray; 
    while(parts.Any()) 
    { 
     int[] currentChunks = parts.Take(length).ToArray(); 
     string[] data = GetDataForUids(currentChunks); 
     parts = parts.Skip(length); 
     foreach (string item in data) 
     { 
      Console.WriteLine(item); 
     } 
    } 
}