2013-01-08 158 views
1

我有这样的代码,通过它我筛选,并得到一套班子改变列表中的项目位置

var groups = Items.Select(g => g.Category).Distinct(); 

已经在列表中我也得到一个空组“”我想在最后的地方索引在group.Can有人请告诉我如何做到这一点。

+0

为什么不使用.OrderBy(g => g.Category)? – slfan

+0

是排序按字母排序组..如果这样,我不想那个..Distinct将它们分组,因为它们出现在项目列表中,这就是我想要的。唯一剩下要做的就是移动“”值到最后。 – user505210

回答

1

如果你想保留原来的订单那么你可以尝试以下。

var temp = Items.Where(r => r.Category != "").Distinct().ToList(); 
if (Items.Any(r=> r.Category == "")) 
    temp.Add(""); 

获取项目的列表没有emptry串Category,然后看看你的原始集合包含和空组,那么你可以将它添加到集合的末尾。

+0

这工作..谢谢大家的超快速和有益的答复。 – user505210

+0

@ user505210,欢迎您 – Habib

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

我觉得orderbyOrderByDescending条款很容易做的工作对你的命令......申请根据自己的需要

var groups = Items.Select(g => g.Category).Distinct().OrderBy(g => g.Key); 

var groups = Items.OrderBy(g => g.Category).Select(g => g.Category).Distinct(); 
+0

OrderBy不会将空字符串从列表中移动到列表的末尾,而是它将成为第一个项目。 – Habib

+1

@哈比卜 - 比我反向的那个“OrderByDescending”做的诀窍.. –

+0

是的,但我不确定这是否是所需的要求。 – Habib

0

过滤掉空字符串(不知道是否它的名称):

var groups = Items.Select(g => g.Category).Where(g => g.Name != "").Distinct(); 

如果您需要空字符串是在列表中,你不想来排序,你将不得不删除和添加它到最后。

3

不完全是,您需要双重排序。如果您使用上述顺序,您将首先获得空字符串。

var groups = Items.Select(g => g.Category).Distinct() 
              .OrderBy(g => g.Length==0) 
              .ThenBy(g=>g.Category); 

现在空的组将是最后一个,而其余的将按字母顺序组织。

0

您可以创建自己的IComparator实现来执行自定义排序。在其中,您可以决定将空字符串放在哪里与其他字符串进行比较。

例如,参见here

0

OrderBy可能与一些聪明的排序标准,如

var groups = Items.Select(g => g.Category).Distinct().OrderBy(
    g => string.IsNullOrEmpty(g.Category) ? 2 : 1); 

本质工作,我们要说的是,所有的组等同尽可能顺序concrned除了那些空的(假设类别是关键emptyness)。其他项目可能会根据实际的排序算法重新排列。

编辑:经测试及以上测试与内存列表一起工作。不确定物品是IQueryAble会发生什么情况。

0

如果您不想更改其余集合的订单。你可以这样做。

var emptyCategory = Items.Where((r) => r.Category == string.Empty); 
var groups = Items.Where((r) => r.Category != string.Empty).Union(emptyCategory);