更改列表中项目的位置



我有这个代码,通过它我筛选并获得一组

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

现在在列表中,我也得到一个空组",我想把它放在组的最后一个索引处。谁能告诉我该怎么做?

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

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

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

如果您想保留原来的顺序,那么您可以尝试以下操作。

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

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

这可能有助于在不影响目录项顺序的情况下完成

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

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

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

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

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

OrderBy可以使用一些巧妙的排序标准,例如

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

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

EDIT:测试和以上工作与内存列表。不确定当Items为IQueryAble时将会发生什么

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

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

相关内容

  • 没有找到相关文章

最新更新