2016-08-25 3 views
-2

Обращаем ваше внимание, что с 1:47 по UTC, 26 августа 2016 года, я полностью изменил этот вопрос, потому что изначально он был очень запутанным. Моя вина за это. Поэтому, пожалуйста, игнорируйте все ответы/комментарии до этого времени. СпасибоLINQ - OrderByDescending

У меня есть список элементов, которые добавляются в список SearchItems с помощью SearchType ... SearchType объекта Objectype, ObjectBType и т. Д. Я хочу, чтобы OrderByDescending SearchTimes занимал элементы, имеющие тип поиска Object Object или ObjectBType. Для всех других SearchType это должен быть порядок по возрастанию.

Это мой запрос:

var orderdItems= SearchItems.OrderBy(i => i.ItemDisplay) 
          .OrderBy(i => i.CategoryDisplay)) 

это критерии, которые я хочу заказать по убыванию.

Where(x => x.SearchType == ObjectAType || x.SearchType == ObjectBType) 

Это структура SearchItem

public class SearchItem 
{ 
    public SearchItem() { } 
    public Guid ItemId { get; set; } 
    public string ItemDisplay { get; set; } 
    public string CategoryDisplay { get; set; } 
    public string SearchType { get; set; } 
} 

И это, как они добавляются в SearchItems = List<SearchItems>();

SearchItems.AddRange(items.Select(i => new SearchItem() 
      { 
       CategoryDisplay = "Object A", 
       ItemDisplay = i.ObjectADisplay, 
       ItemId = i.ObjectAId, 
       SearchType = ObjectAType, 
      })); 

SearchItems.AddRange(items.Select(i => new SearchItem() 
      { 
       CategoryDisplay = "Object B", 
       ItemDisplay = i.ObjectBDisplay, 
       ItemId = i.ObjectBId, 
       SearchType = ObjectBType, 
      })); 

и так далее .... 'пункты' являются IEnumerable<ObjectA>, IEnumberable<ObjectB> и т.д. .

+4

Как вы собираетесь сортировать 2 из 26 предметов в одной коллекции? Это само по себе не имеет смысла, как будто я хочу, чтобы буквы C и F были отсортированы в списке буквенных символов. Что бы вы сделали с остальными? Я думаю, хотя есть что-то, что либо вы нам не рассказываете, либо не объясняете с достаточной детализацией. Например: это список элементов, в которых каждый элемент также имеет списки, и вы хотите, чтобы 2 из этих контейнеров были отсортированы? Вам необходимо предоставить структуру модели для типов, которые вы хотите отсортировать, с более подробной информацией. – Igor

+0

Возможно, есть способ написать два запроса, а затем объединить результат перед сериализацией? – User123

+1

Ваше объяснение проблемы не имеет технического смысла. Вы просто хотите, чтобы 2 элемента отображались сначала в списке перед другим 26? Это очень легко сделать, но вы не можете сортировать часть списка, вы сортируете все либо явно, либо неявно (это всегда произойдет) или ничего. – Igor

ответ

1
var desc = this.SearchItems 
       .Where(x => x.SearchType == Foo || x.SearchType == Bar) 
       .OrderByDescending(i => i.ItemDisplay) 
       .ThenByDescending(i => i.CategoryDisplay); 
var asc = this.SearchItems 
       .Where(x => x.SearchType != Foo && x.SearchType != Bar) 
       .OrderBy(i => i.ItemDisplay) 
       .ThenBy(i => i.CategoryDisplay); 
var result = desc.Concat(asc); 

Конечно, вы можете сделать это как один запрос.

Я предполагаю, что вы хотите сначала спустить два нисходящих объекта. Если это не так, верните последнее утверждение.

var result = asc.Concat(desc); 

Если вы хотите отсортировать сам список, а затем сделать это

this.SearchItems = desc.Concat(asc).ToList(); 
+0

Я делал что-то подобное раньше, но я попробую это с его немного другого завтрашнего дня и дам вам знать, спасибо всем! – User123

+0

Похоже, что даже после внесения изменений в исходный вопрос эта техника работала для меня! Спасибо, Оливер! – User123

0
SearchItems.OrderBy(x => (x.SearchType == Foo || x.SearchType == Bar) ? 0 : 1); 

Это приведет к SearchType = Foo или Bar в верхней части списка и всего остального после него. Вы можете получить более конкретные, если вы хотите Foo Bar, прежде чем с:

SearchItems.OrderBy(x => x.SearchType == Foo ? 0 : x.SearchType == Bar ? 1 : 2); 

В вашем примере я понятия не имею, что SearchType является или Foo или Bar, но я думаю, вы получите идею.

В этом примере тип, который будет использоваться для сортировки, - int, а сортировка по умолчанию - по возрастанию (от малого до большого). Таким образом, выражение OrderBy выше вернет 0 за Foo, положив его первым, 1 за Bar, разместив его 2-го и 2 для чего-нибудь еще, разместив их после Foo и Bar.

+0

@ User123 - Я добавил описание в конце. – Igor

+0

Хорошо, я использовал подход 1, но теперь объекты не A или B, их предметы не упорядочены по возрастанию или по убыванию. они все просто плавают везде. – User123

1

Вопрос довольно запутанный, но если я правильно понял, у вас есть 26 объектов, и вы хотите сериализованную список объектов, для которых объект А первый, затем объект B, затем все остальные объекты, упорядоченные по свойству. C.

Если это так, это может быть записано путем упорядочивания объектом, являющимся сначала объектом А.

SearchItemsJson = serializer.Serialize(
        this.SearchItems 
         .OrderByDescending(i => i.SearchType == "Foo") 
         .ThenByDescending(i => i.SearchType == "Bar") 
         .ThenBy(i => i.ItemDisplay) 
         .ThenBy(i => i.CategoryDisplay)) 

Сказав, что это звучит, как вы жестко прописывать какую-то логику об объектах, которые, вероятно, принадлежат как свойство объекта. Что особенного в этих двух объектах, которые означают, что они должны быть перечислены первыми. Может быть, у вас есть третий специальный объект в будущем? Добавление флага, такого как «Featured» к объекту, может быть более гибким способом моделирования бизнес-проблемы, которую вы пытаетесь решить.