请注意:截至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>
等等。
答案 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
= Foo
或Bar
以及其后的所有内容。如果您想在Bar之前使用Foo,可以获得更具体的信息:
SearchItems.OrderBy(x => x.SearchType == Foo ? 0 : x.SearchType == Bar ? 1 : 2);
在您的示例中,我不知道SearchType
是什么,Foo
还是Bar
,但我认为您明白这一点。
在此示例中,将用于排序的类型为int
,默认排序为升序(从小到大)。因此,上面的OrderBy表达式将返回0
Foo
将其放在第一位,1
将Bar
置于第2位,将2
放回Foo之后的其他位置和酒吧。