c#中實現ienumerable介面的類提供了很多擴充套件方法,其中select,where等為最常見的,且幾乎和sql語法類似比較好理解,基本滿足了日常處理集合的大部分需求,然而還有一部分稍有不一樣理解起來比較拗,實際分析一下實現的原理倒也很好理解,本篇文章介紹一下groupby的使用方法。
student類:
public class student
public string classname
public string studentname
}設定資料如下:
list studentlist = new list
,new student ,
new student ,
new student ,
new student ,
new student ,
};我們假設兩個班裡的學生總共有六名,現在根據班級分組
ienumerable> studentgroup = studentlist.groupby(s => s.classname);
如**,呼叫groupby擴充套件方法後,返回型別為ienumerable>, ienumerable代表了返回結果可被foreach遍歷,其中泛型實現為igrouping,按照普遍理解的分組的概念,可以推斷igrouping中應該是string代表的是乙個key,即classname,那麼key對應的應該就是乙個student的集合,但是**應該怎樣實現呢?
可以首先foreach一下studentgroup
foreach 程式設計客棧(igrouping item in studentgroup)
這時候可以item.一下看看提示資訊
這時候發現,只能提示出來的屬性只有乙個key,那麼怎樣通過item獲取到分組後的student集合呢?這時候發現第二個getenumerator()方法,這個說明了item是可以被foreach的,型別為ienumerator,說明了可被遍歷的型別為student
然後可以foreach下item試一試
如果所示,果然是student,根據推斷,現在在foreach中遍歷所有資料,然後打出來看一下
fwww.cppcns.comoreach (igrouping item in studentgroup)
}執行結果如下:
所以可以斷定item是乙個student的集合,那麼為什麼item還有個key屬性呢,好像是和平常的集合不太一樣,事實確實是不一樣的,我們看下igrouping的定義如下:
public inte***ce igrouping : ienumerable, ienumerable
}igrouping的key是作為自己的屬性來儲存了,telement則實現了ienumerable,所以呼叫foreach遍歷igrouping的時候返回的即是student的集合了
這個探索是挺有趣的,通過神器vs的智慧型提示和原始碼的實現最終知道了groupby的用法,並且了解了為什麼這樣用。
同時也看出了通過介面可以巧妙的實現多型,其中自然是妙趣無窮!
報錯 不是GROUP BY 表示式
oracle庫中 group by後面必須加上你select後面所查詢的所有除聚合函式之外的所有字段。解決方法 將group by放入子查詢中使用或者將select後面的所有查詢字段放入group by 後。報錯 不是group by 表示式 例項 select sum hwjz rq from j...
INSERT 報 不是Group by 表示式
今天在插入資料時,發下如下sql 死活報錯 insert into test select psnid,sum f1 from psn inner join select max year lastyear,psnid from wagedata t group by psnid tmp on ps...
C 中的表示式
表示式是在運算元和運算子的基礎上構造而成。表示式的運算子指明了向運算元應用的運算。運算子的示例包括 和new。運算元的示例包括文字 字段 區域性變數和表示式。如果表示式包含多個運算子,那麼是運算子的優先順序決定了各個運算子的計算順序。例如,表示式 x y z相當於計算x y z 因為 運算子的優先順...