2017-01-23 6 views
0

Предположим, что у меня есть список предметов от 1 до 3.Как отсортировать заказ цикла с использованием запроса linq в C#?

Я мог бы заказать их на 1,1,2,2,3,3.

Но вместо этого, я хотел бы заказать их 1,2,3,1,2,3 ....

Есть ли уже существуют функции для достижения этой цели?

+1

Нет, нет. Я даже не могу назвать такую ​​сортировку одним или двумя словами. Вы можете реализовать его самостоятельно. –

+1

Это может быть технически возможно с использованием LINQ, но это было бы грязно. Было бы намного проще и эффективнее реализовать его самостоятельно. – Abion47

+0

Не имеет смысла. Что, если это '1,1,2,2,3,3,3,3,4', каков будет выход? Из коробки Linq предоставляет реализации, которые являются обычными, например, порядок или порядок по убыванию. Что это за заказ? Похож на очень конкретный случай – CodingYoshi

ответ

2

Этот подход разделяет каждое число на группы, а затем выполняет итерации по группам в порядке, условно добавляя их в список результатов. Вероятно, есть способы сделать это более безопасным и эффективным, но это должно дать вам начало. (Это предполагает, что если не равные отсчеты каждого числа в исходном массиве, он будет пропускать эти цифры, как она работает из них на этапе итерации.)

int[] arr = new[] { 1,1,1,2,2,2,3,3,3,4,4,4,5,5,5 }; 

var orderList = arr.OrderBy(x => x).Distinct().ToArray(); 
var refList = arr.GroupBy(x => x).ToDictionary(k => k.Key, v => v.Count()); 

var result = new List<int>(); 
int i = 0; 
while (result.Count < arr.Length) 
{ 
    if (refList.Values.Sum() == 0) 
     break; 

    if (refList[orderList[i]] > 0) 
    { 
     result.Add(orderList[i]); 
     refList[orderList[i]]--; 
    } 

    i++; 
    if (i >= orderList.Length) 
     i = 0; 
} 

// Result: [1,2,3,4,5,1,2,3,4,5,1,2,3,4,5] 
+0

У меня вообще появилась идея. Я попробую это для себя, так как 1,2,3 - это всего лишь тип объектов, которые у меня есть. –

+0

или потенциально: 'var result = Enumerable.Range (arr.Min(), arr.GroupBy (x => x) .First(). Count()) .SelectMany (y => arr.OrderBy (x => x) .Distinct(). ToList()); ' – CodingYoshi

+0

@CodingYoshi Предположим, что A] числа в списке источников гарантированно будут в последовательном порядке, а B] подсчеты каждого номера в списке источников гарантированы быть равным. – Abion47