2015-01-06 1 views
-4

Я список 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 элемента с последних 3-х элементов для каждой из последовательностей 6-элементов.

Как это:

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