1

我有这段代码,我通过它过滤并获得一组组

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

现在在列表中,我还得到一个空组“”,我想将其放在组中的最后一个索引处。有人可以告诉我该怎么做。

4

7 回答 7

3

不完全是,您需要双重订购。如果您使用上面的 orderby,您将首先获得空字符串。

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

现在空组将排在最后,其余的将按字母顺序排列。

于 2013-01-08T06:56:52.910 回答
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();

我认为orderbyorOrderByDescending 子句可以轻松为您完成工作...根据您的需要申请

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

或者

var groups = Items.OrderBy(g => g.Category).Select(g => g.Category).Distinct();
于 2013-01-08T06:51:48.947 回答
1

如果您想保留原始订单,则可以尝试以下操作。

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

获取没有空字符串的项目列表,Category然后查看您的原始集合是否包含空组,然后您可以将其添加到集合的末尾。

于 2013-01-08T07:04:03.890 回答
0

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

 var emptyCategory = Items.Where((r) => r.Category == string.Empty);
 var groups = Items.Where((r) => r.Category != string.Empty).Union(emptyCategory);
于 2013-01-08T07:11:23.070 回答
0

过滤掉空字符串(不确定是不是名字):

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

如果您需要将空字符串放在列表中并且不想排序,则必须将其删除并将其添加到末尾。

于 2013-01-08T06:56:19.443 回答
0

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

例如,请参见此处

于 2013-01-08T07:00:37.547 回答
0

OrderBy可能适用于一些聪明的订购标准,例如

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

本质上,我们所说的是,除了那些空的(假设类别是空的关键)之外,就顺序而言,所有组都是等价的。根据实际的排序算法,其他项目仍有可能重新排列。

编辑:经过测试及以上适用于内存列表。不确定当 Items 是时会发生什么IQueryAble

于 2013-01-08T07:01:03.333 回答