修改IEnumerable类型

时间:2013-01-08 13:53:51

标签: c#

我有一个字符串IEnumerable类型,我可以从下面的代码中获得.var组是一个Enumerable类型,它有一些字符串值。假设组中有4个值,而在第二个位置,该值只是空字符串“”。问题是如何将其移动到第4个即结束位置。我不想排序或更改任何顺序。只是移动在最后一个位置发生的空“”值。

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

5 个答案:

答案 0 :(得分: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)));

答案 1 :(得分:2)

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

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

请注意,在此查询中,groups会重复两次。对于延迟IEnumerable<>,这通常不是一个好习惯,因此您应该在ToList()之后调用Distinct()来急切地评估您的LINQ查询:

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

编辑:

第二个想法,有一个更简单的方法来做到这一点:

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

请注意,由于OrderBy稳定,因此不会触及非空元素的顺序。

答案 2 :(得分:1)

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

答案 3 :(得分: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)));

答案 4 :(得分:-1)

尝试类似

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