3

我有一个从下面的代码中获得的字符串IEnumerable类型。 var groups 是一种Enumerable具有一些字符串值的类型。假设组中有 4 个值,第二个位置的值只是空字符串 "" 。问题是我怎样才能将它移动到第四个,即结束位置。我不想排序或更改任何顺序。只是移动空的“”值,无论它出现在最后一个位置。

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

5 回答 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)));
于 2013-01-08T13:56:41.383 回答
2

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

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

请注意,在此查询中,groups被迭代两次。对于 deferred 而言,这通常不是一个好的做法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它是稳定的。

于 2013-01-08T14:01:58.930 回答
1
var groups = Items.Select(g => g.Category).Distinct().OrderByDescending(s =>s);
于 2013-01-08T13:56:49.443 回答
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)));
于 2013-01-08T14:02:58.090 回答
-1

尝试类似的东西

var temp = groups.Where(item => ! String.IsNullOrEmpty(item)).ToList<string>();
while (temp.Count < groups.Count) temp.Add("");
于 2013-01-08T14:06:52.903 回答