2013-01-08 46 views
3

我有一個字符串IEnumerable類型,我從下面的代碼獲得。var groups是一個Enumerable類型,它有一些字符串值。假設組中有4個值,第二個位置的值爲空字符串「」。問題是我如何將它移動到第四位即結束位置。我不想排序或更改任何順序。只要移動無論它發生在最後一個位置,它都是空的「」值。修改一個IEnumerable類型

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

嗯......我想你可以做一個orderByDescending? – Kek

+0

我不想更改訂單或對其進行分類。只需將空白「」值轉至最後位置即可。 – user505210

+0

然後刪除空值(如果存在)並將其添加到末尾。 – lahsrah

回答

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觸摸非空元素的順序是穩定的。

+0

這可以完美地工作。創建新實例並將「」移到最後而不修改其他順序。 – user505210

+0

@ user505210:我剛剛添加了另一個簡化版本。檢查我的編輯;) – digEmAll

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))); 
+0

爲什麼你仍然訂購非空容器? – lahsrah

+0

@sylon是一個錯誤,修復。 – Rotem

+0

@Rotem:string.IsEmpty不存在於C#中... – 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(""); 
+0

@羽絨投票人:你可以請注意解釋這種方法有什麼問題,除了它不是最有效的方法來實現結果嗎? – prthrokz