2013-02-12 3 views
1

Я искал решение этой проблемы, и хотя я нашел подобное, я не смог найти ответ на эту конкретную проблему. Я обобщил эту проблему, но это идет что-то выглядит следующим образом:Переупорядочить по исходному индексу при использовании Linq

У меня есть следующий ИНТ []

[423] 
[234] 
[5] 
[79] 
[211] 
[1001] 

Я хотел бы использовать LINQ только выбрать элементы, которые меньше, чем 200 или больше 300, а затем упорядочить по первоначальному индексу массива так, чтобы конечный массив гарантировано быть:

[423] 
[5] 
[79] 
[1001] 
+0

проверка http://stackoverflow.com/q/2410070/1080742 – spajce

ответ

1

LINQ to object сохраняет порядок в выборе, поэтому простейшее предложение where выполнит эту работу.

Order Preservation in PLINQ

В PLINQ, цель состоит в том, чтобы максимально увеличить производительность при сохранении правильности. Запрос должен выполняться как можно быстрее, но при этом давать правильные результаты. В некоторых случаях правильность требует сохранения последовательности исходной последовательности; однако заказы могут быть дорогостоящими. Поэтому по умолчанию PLINQ не сохраняет порядок исходной последовательности. В связи с этим PLINQ напоминает LINQ to SQL, но является , в отличие от LINQ to Objects, который сохраняет порядок.

Но если вы хотите, вы можете выбрать index со значением, а затем использовать OrderBy на index

int[] array = new [] 
{ 
    423,234,5,79,211,1001 
}; 


var sortedArray = array.Select((r, i) => new { value = r, index = i }) 
         .Where(t => t.value < 200 || t.value > 300) 
         .OrderBy(o => o.index) 
         .Select(s => s.value).ToArray(); 
1

При фильтрации объектов с Enumerable.Where исходного заказа сохраняется. MSDN:

LINQ к объектам, это сохранение заказа

несколько слов. Вы можете думать о Where как о простых элементах фильтрации в цикле foreach, который возвращает элементы один за другим, в том же порядке, что и в цикле. Пример:

public IEnumerable<T> Where(this IEnumerable<T> sequence, Func<T,bool> predicate) 
{ 
    foreach(var item in sequence) 
     if (predicate(item)) 
      yield return item; 
} 

Подробнее о Jon blog.

0

Нет необходимости делать какие-либо сортировки, заказ будет оставлен в силе.

var someInts = new int[] { 423, 234, 5, 79, 211, 1001 }; 
var filteredInts = someInts.Where(i => i < 200 || i > 300); 

// filteredInts = [423, 5, 79, 1001] 
+0

Кажется, я обнаружил, что, когда массив v.large иногда порядок не сохраняется. Мои выражения linq ужасно сложны, но если я смогу решить этот простой пример, то он решает мою основную проблему. – Jaqq

Смежные вопросы