2015-01-06 37 views
-4

我已经通过INT(这是关键)订购了KeyValuePair列表订购KeyValuePair列表,所以我有一个序列:以特定方式

01, 02, 03, 04, 05, 06, 07, 08, 09, 10... 

我必须要改变的顺序我元素(6分页6):

01, 04, 02, 05, 03, 06, 
07, 10, 08, 11, 09, 12, 
13, 16, 14, 17, 15, 18... 

以单位时间内的六大要素应该足够总结3至各个指标,但我不能元素回迁和FORW。有任何想法吗?

+0

我真的不明白你想要什么。你需要什么样的特定类型,你想要它是什么样的? – Jonesopolis

+0

我不明白这句话:“每次拿六个元素应该足以把每个索引加起来3” –

+0

@ L.B这真的不是重复吗?他想重新排列元素,而不是批量处理它们。示例看起来像一批,因为这是他如何布置它,但它仍然是一个单一的列表。 –

回答

2

您可以partition列表中6个元素的序列,那么你interleave第3个元素为每个6元序列的最后3个元素。

像这样:

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

public static class MyExtentions 
{ 
    public static IEnumerable<T> Interleave<T>(
     this IEnumerable<T> first, 
     IEnumerable<T> second) 
    { 
     using (IEnumerator<T> 
      enumerator1 = first.GetEnumerator(), 
      enumerator2 = second.GetEnumerator()) 
     { 
      while (enumerator1.MoveNext()) 
      { 
       yield return enumerator1.Current; 
       if (enumerator2.MoveNext()) 
        yield return enumerator2.Current; 
      } 
     } 
    } 

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


public class Program 
{ 
    public static void Main() 
    { 
     var sequence = Enumerable.Range(1, 18); 
     var result = sequence 
         .Partition(6) 
         .Select(s => { 
           var firstThree = s.Take(3); 
           var lastThree = s.Skip(3); 
           return firstThree.Interleave(lastThree); 
          }) 
         .SelectMany(x => x); 
     foreach(var i in result){ 
      Console.WriteLine(i); 
     } 
    } 
} 

我也把一个fiddle

1

如果你做了这样的事情怎么办?首先应用分页,然后按照您希望的方式专门订购您的钥匙。

List<int> keys = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18 }; 

int page = 1; 
int keysPerPage = 6; 
// Apply paging to the keys. 
var pagedKeys = keys.Skip((page - 1) * keysPerPage).Take(keysPerPage).ToList(); 

// Then, take the keys in the order of 0,3,1,4,2,5 
var orderedKeys = new List<int>() { pagedKeys[0], pagedKeys[3], pagedKeys[1], pagedKeys[4], pagedKeys[2], pagedKeys[5] };