我有这个代码,通过它我可以过滤并获得一组组
var groups = Items.Select(g => g.Category).Distinct();
现在在列表中我还得到一个空组“”我想放在组中的最后一个索引。有人请告诉我如何执行此操作。
答案 0 :(得分:3)
不完全是,你需要双重订购。如果你使用上面的顺序,你将首先获得空字符串。
var groups = Items.Select(g => g.Category).Distinct()
.OrderBy(g => g.Length==0)
.ThenBy(g=>g.Category);
现在空组将是最后一组,而其余组将按字母顺序组织。
答案 1 :(得分:1)
这可能有助于此而不影响类别项目的顺序
var WithoutNull =
(from item in Items
where !string.IsNullOrEmpty(item.Category)
select item.Category).ToList();
var WtihNull=
from item in db.SomeTable
where string.IsNullOrEmpty(item.Category)
select item.Category).ToList();
var allvalues= WithoutNull.Concat(WtihNull)
.ToList();
我认为orderby
或OrderByDescending
条款会为您轻松完成工作......根据您的需要申请
var groups = Items.Select(g => g.Category).Distinct().OrderBy(g => g.Key);
或
var groups = Items.OrderBy(g => g.Category).Select(g => g.Category).Distinct();
答案 2 :(得分:1)
如果您想保留原始订单,则可以尝试以下操作。
var temp = Items.Where(r => r.Category != "").Distinct().ToList();
if (Items.Any(r=> r.Category == ""))
temp.Add("");
获取没有emptry字符串Category
的项目列表,然后查看原始集合是否包含空组,然后您可以将其添加到集合的末尾。
答案 3 :(得分:0)
过滤掉空字符串(不确定它是否是名称):
var groups = Items.Select(g => g.Category).Where(g => g.Name != "").Distinct();
如果您需要将空字符串放在列表中并且您不想排序,则必须将其删除并添加到最后。
答案 4 :(得分:0)
您可以创建自己的IComparator实施来执行自定义排序。在其中,您可以决定将空字符串放在哪里与其他字符串相比。
例如,请参阅here。
答案 5 :(得分:0)
OrderBy
可以使用一些聪明的订购标准,例如
var groups = Items.Select(g => g.Category).Distinct().OrderBy(
g => string.IsNullOrEmpty(g.Category) ? 2 : 1);
基本上,我们所说的是,除了那些空的(假设类别是空的关键)之外,所有组都是等价的。仍有可能根据实际的排序算法重新安排其他项目。
编辑:已测试及以上版本适用于内存列表。不确定项目为IQueryAble
时会发生什么。
答案 6 :(得分:0)
如果您不想更改其余收集的订单。你可以这样做。
var emptyCategory = Items.Where((r) => r.Category == string.Empty);
var groups = Items.Where((r) => r.Category != string.Empty).Union(emptyCategory);