2011-08-05 66 views
44

我有一個String數組,還挺像這樣:LINQ查詢GROUP BY和選擇第一項

// icon, category, tool 
String[,] subButtonData = new String[,] 
{ 
    {"graphics/gui/brushsizeplus_icon", "Draw", "DrawBrushPlus"}, 
    {"graphics/gui/brushsizeminus_icon", "Draw", "DrawBrushMinus"}, 
    {"graphics/gui/freedraw_icon", "Draw", "DrawFree"}, 
    {"graphics/gui/linedraw_icon", "Draw", "DrawLine"}, 
    {"graphics/gui/rectangledraw_icon", "Draw", "DrawRectangle"}, 
    {"graphics/gui/ellipsedraw_icon", "Draw", "DrawEllipse"}, 
    {"graphics/gui/brushsizeplus_icon", "Brusher", "BrusherBrushPlus"}, 
    {"graphics/gui/brushsizeminus_icon", "Brusher", "BrusherBrushMinus"}, 
    {"graphics/gui/brushsizeplus_icon", "Text", "TextBrushPlus"}, 
    {"graphics/gui/brushsizeminus_icon", "Text", "TextBrushMinus"}, 
}; 

然後我填充List<Button>我叫mainButtons

按鈕鍵入這是我的查詢進行分組Category

var categories = from b in mainButtons 
       group b by b.category into g 
       select new { Category = g.Key, Buttons = g }; 

如何在我的主列表中選擇每個組的第一個項目? (沒有迭代每個並添加到另一個列表?)

+2

爲什麼您的查詢使用與樣本集合不同的東西? – svick

回答

54

LINQ: How to get the latest/last record with a group by clause

var firstItemsInGroup = from b in mainButtons 
       group b by b.category into g 
select g.First(); 

我認爲mainButtons已經正確排序。

如果您需要指定自定義排序順序,請使用OrderBy覆蓋與Comparer。

var firstsByCompareInGroups = from p in rows 
     group p by p.ID into grp 
     select grp.OrderBy(a => a, new CompareRows()).First(); 

見一個例子,我的崗位"Select First Row In Group using Custom Comparer

+0

這裏和博客文章中的例子正是我所需要的。謝謝! – tjans

5

首先,我不會使用多維數組。只見過不好的事情。

設置您的變量是這樣的:

IEnumerable<IEnumerable<string>> data = new[] { 
    new[]{"...", "...", "..."}, 
    ... etc ... 
}; 

然後,你乾脆去:

var firsts = data.Select(x => x.FirstOrDefault()).Where(x => x != null); 

在哪裏確保它修剪任何空值,如果你有一個空列表作爲項目內。

或者你可以實現它:

string[][] = new[] { 
    new[]{"...","...","..."}, 
    new[]{"...","...","..."}, 
    ... etc ... 
}; 

這也同樣可以用於將[x,y]數組,但它的使用是這樣的:[x][y]

+0

阿倫非常感謝很多人! – JML

+0

如果你在.Net 4上,使用IEnumerable >命令可以更簡單,這樣你就可以確保你總是有三個項目。對於早期的.Net版本,甚至可能值得努力製作自己的Tuple類(或者從互聯網上挑選它,不能錯過)。 –

+0

我對.NET 4中的Tuples感到非常興奮,但是我發現,由於我已經使用它們,它的冗長性使得它們比它們的價值更麻煩。特別是當你有複雜的元組時:'元組,IDictionary <字符串,SomeClass>,int>'在你的代碼中複製了幾個位置變得很快。 – Aren

46
var result = list.GroupBy(x => x.Category).Select(x => x.First()) 
2
var results = list.GroupBy(x => x.Category) 
      .Select(g => g.OrderBy(x => x.SortByProp).FirstOrDefault()); 

對於那些想知道如何爲那些不一定正確排序組做到這一點,這裏有this answer使用擴展方法語法來自定義每個組的排序順序,從而獲得每個組的期望記錄。

注意:如果您使用的是LINQ-to-Entities,那麼如果您在此處使用First()而不是FirstOrDefault(),則會得到運行時異常,因爲前者只能用作最終查詢操作。