2013-01-08 163 views
1

我有這樣的代碼,通過它我篩選,並得到一套班子改變列表中的項目位置

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

已經在列表中我也得到一個空組「」我想在最後的地方索引在group.Can有人請告訴我如何做到這一點。

+0

爲什麼不使用.OrderBy(g => g.Category)? – slfan

+0

是排序按字母排序組..如果這樣,我不想那個..Distinct將它們分組,因爲它們出現在項目列表中,這就是我想要的。唯一剩下要做的就是移動「」值到最後。 – user505210

回答

1

如果你想保留原來的訂單那麼你可以嘗試以下。

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

獲取項目的列表沒有emptry串Category,然後看看你的原始集合包含和空組,那麼你可以將它添加到集合的末尾。

+0

這工作..謝謝大家的超快速和有益的答覆。 – user505210

+0

@ user505210,歡迎您 – Habib

1

這可能有助於該做的,而不會影響類項目

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

OrderBy不會將空字符串從列表中移動到列表的末尾,而是它將成爲第一個項目。 – Habib

+1

@哈比卜 - 比我反向的那個「OrderByDescending」做的訣竅.. –

+0

是的,但我不確定這是否是所需的要求。 – Habib

0

過濾掉空字符串(不知道是否它的名稱):

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

如果您需要空字符串是在列表中,你不想來排序,你將不得不刪除和添加它到最後。

3

不完全是,您需要雙重排序。如果您使用上述順序,您將首先獲得空字符串。

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

現在空的組將是最後一個,而其餘的將按字母順序組織。

0

您可以創建自己的IComparator實現來執行自定義排序。在其中,您可以決定將空字符串放在哪裏與其他字符串進行比較。

例如,參見here

0

OrderBy可能與一些聰明的排序標準,如

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

本質工作,我們要說的是,所有的組等同儘可能順序concrned除了那些空的(假設類別是關鍵emptyness)。其他項目可能會根據實際的排序算法重新排列。

編輯:經測試及以上測試與內存列表一起工作。不確定物品是IQueryAble會發生什麼情況。

0

如果您不想更改其餘集合的訂單。你可以這樣做。

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