修改一个IEnumerable类型

3

我有一个从下面的代码中得到的IEnumerable类型的字符串。变量 groups 是一个 Enumerable 类型,其中包含一些字符串值。假设在 groups 中有 4 个值,在第二个位置上的值是空字符串 ""。问题是如何将其移动到第四个即最后的位置。我不想排序或更改任何顺序。只需将空的 "" 值移动到它出现的最后位置。

List<Item> Items = somefunction();
var groups = Items.Select(g => g.Category).Distinct();

3
好的,我可以使用 orderByDescending 进行排序吗? - Kek
我不想改变顺序或排序,只需将空的""值移到最后一个位置。 - user505210
然后,如果存在空值,则删除它并添加到末尾。 - lahsrah
我认为那就是我所问的。 - user505210
这么多答案都忽略了显而易见的事实。尽管Linq很强大,但如果普通的for循环更易读且更容易理解,请使用它。 - Benjamin Gruenbaum
@BenjaminGruenbaum,你的for循环答案在哪里呢? :) - Rotem
5个回答

4

只需按字符串值对结果进行排序:

List<Item> Items = somefunction();
var groups = Items.Select(g => g.Category).Distinct().OrderByDescending(s => s);

编辑(根据OP编辑):

List<Item> Items = somefunction();
var groups = Items.Select(g => g.Category).Distinct();

groups = groups.Where(s => !String.IsNullOrEmpty(s))
    .Concat(groups.Where(s => String.IsNullOrEmpty(s)));

你为什么还在降序排列非空的内容? - lahsrah
@sylon 犯了一个错误,已经修复。 - Rotem
@digEmAll 再次抱歉,我的意思是 IsNullOrEmpty - Rotem

2

您不能直接修改 IEnumerable<> 实例,但是您可以创建一个新实例:

var list = groups.Where(x => x != "").Concat(groups.Where(x => x == ""));

请注意,在此查询中,groups 被迭代了两次。对于延迟的 IEnumerable<>,通常不建议这样做,因此您应该在 Distinct() 之后调用 ToList() 来急切地评估您的 LINQ 查询:

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

编辑:

仔细想了想,有一种更简单的方法来完成这个操作:

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

请注意,这并不会改变非空元素的顺序,因为OrderBy是稳定的。

这个完美地工作。创建了新实例并将“”移动到末尾,而不修改其他顺序。 - user505210
@user505210:我刚刚添加了另一个简化版本。请查看我的编辑 ;) - digEmAll

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

0

我不喜欢我的查询,但它应该能胜任工作。它选择所有非空项目并将其与空项目合并。

var groups = Items.Select(g => g.Category).Distinct()
.Where(s => !string.IsNullOrEmpty(s))
.Union(Items.Select(g => g.Category).Distinct()
.Where(s => string.IsNullOrEmpty(s)));

-1

尝试类似这样的东西

var temp = groups.Where(item => ! String.IsNullOrEmpty(item)).ToList<string>();
while (temp.Count < groups.Count) temp.Add("");

楼下的投反对票者:你能否解释一下这种方法除了不是实现结果最有效的方式之外还有什么问题吗? - prthrokz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接