【问题标题】:Putting Some Items First in List<T>将一些项目放在 List<T> 的首位
【发布时间】:2015-02-16 21:03:00
【问题描述】:

我只是想知道将某些项目放在列表顶部的列表中的最佳方法。此模型用于在视图中显示搜索结果,并以 List&lt;T&gt; 的形式来自控制器。所以我的目标是 Display all Items ,但是具有特定属性的 Items 将转到列表的开头,因此它们首先显示。

所以我的控制器会是这样的:

List<Item> listFromRepository = repository.GetSearchResults();
List<Item> topItems = listFromRepository
                            .Where(x => x.Subject == 5)  // any filter for items to be at top of search results
List<Item> listForView = new List<Item>();
listForView.AddRange(topItems);
listForView.AddRange(listFromRepository.Exclude(x => x.Subject == 5));
return Json(listForView);

【问题讨论】:

  • 这种方法有什么问题?什么不工作?
  • 为什么不使用 order by?
  • 这就是我想要的,但我不认为 OrderBy() 允许您执行类似所有带有 SubjectId == 5 的项目到顶部和所有其他 SubjectId 之后的事情
  • arrrggghhh 。不是降序,一个特定的数字,比如用户选择了 24 ,然后 24 到顶部,然后每隔一个数字在后面
  • @ScottSelby 啊,您可能想将其添加到您的问题中

标签: c# asp.net-mvc linq entity-framework


【解决方案1】:

大概是这样的:-

List<Item> topItems = listFromRepository.Where(x => x.Subject == 5)
                       .Concat(listFromRepository.Where(x => x.Subject != 5));

【讨论】:

  • 废话,怎么只有你知道我的意思,我以为我很清楚
  • 这行得通,还没有测试过,但我知道它会很好
  • 我完全同意,这行得通。但这将迭代列表两次,这不亚于您拥有的代码。它看起来更干净,但最终还是一样。所以怀疑你会得到你的性能提升。
  • @Johan - 你不可能全都赢,那样就行了。你对性能的看法是正确的......我认为......
  • @RahulSingh 实际上他确实提到他想要优化,但似乎将其删除。但无论如何,你的答案是对的。
【解决方案2】:

Linq 中还有一个OrderBy 函数。在这种情况下,您可以按主题按降序排序。

listFromRepository.OrderByDescending(x => x.Subject)

【讨论】:

  • 是的,我知道,但是我如何用它来表示先放置主题 7,然后再放置所有其他 1 - 20
  • 那我建议你用一个重量。 var items = from i in listFromRepository let weight = GetWeight(i) orderby weight select i;具有创建权重的功能static int GetWeight(Item i) { return i.Subject == 5 ? 0 : 1; }
【解决方案3】:

也许你想要这个:

var listForView = listFromRepository.GroupBy(x => x.Subject == 5)
    .OrderByDescending(g => g.Key).SelectMany(g => g);

如果 SelectMany 与订单混淆,我添加了 OrderBy。 这比其他可能的查询简洁且快速。

【讨论】:

  • 不,您仍然需要将返回的内容与另一个列表连接起来,这与另一个选定的答案非常接近
  • 另一个列表以 1 的键分组,我认为 SelectMany 没问题。
【解决方案4】:

试试这个

listFromRepository.OrderBy(x => x.Subject != 4).ToList();

【讨论】:

    猜你喜欢
    • 2019-03-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    相关资源
    最近更新 更多