LINQ - OrderByDescending

时间:2016-08-25 20:46:06

标签: c# linq

请注意:截至2016年8月26日UTC时间下午1:47,我完全修改了这个问题,因为最初它非常令人困惑。我的错。所以请在此之前忽略所有答案/评论。感谢

我有一个由SearchType添加到SearchItems列表的项目列表... ObjectType类型的ObjectType,ObjectBType等。我想通过SearchType为ObjectAType或ObjectBType的项目来命令OrderByDescending SearchTimes。对于所有其他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,
            }));

依此类推....'items'是IEnumerable<ObjectA>, IEnumberable<ObjectB>等等。

3 个答案:

答案 0 :(得分:2)

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);

当然,您也可以将其作为一个查询。

我假设您首先想要2个降序对象。如果情况并非如此,则转动最后一个声明。

var result = asc.Concat(desc);

如果您想对列表本身进行排序,请执行此操作

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

答案 1 :(得分:1)

这个问题相当令人困惑,但是如果我已经理解正确你有26个对象并且你想要这些对象的序列化列表,那么对象A首先是对象B,那么所有剩下的对象都按属性C排序

如果是这样,可以通过首先按对象A排序来编写。

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

话虽如此,听起来像是硬编码了一些关于可能属于对象属性的对象的逻辑。这两个对象的特殊之处在于它们需要首先列出。将来你有第三个特殊物品吗?向对象添加诸如“精选”之类的标记可能是一种更灵活的方式来建模您尝试解决的业务问题。

答案 2 :(得分:0)

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

这将导致列表顶部的SearchType = FooBar以及其后的所有内容。如果您想在Bar之前使用Foo,可以获得更具体的信息:

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

在您的示例中,我不知道SearchType是什么,Foo还是Bar,但我认为您明白这一点。

在此示例中,将用于排序的类型为int,默认排序为升序(从小到大)。因此,上面的OrderBy表达式将返回0 Foo将其放在第一位,1Bar置于第2位,将2放回Foo之后的其他位置和酒吧。