DataTable、List使用groupby进行分组和分组统计;List、DataTable查询筛选方法
2014-08-29 09:42
579 查看
DataTable分组统计:
DataTable去除重复的方法:
一、ToTable方法来自动过滤所有重复行的数据,代码如下:
dt_new中存储的就是我们想要的所有不重复行的数据了。
讲解:
1.DefaultView的返回类型是DataView,而DataView的定义就是:
表示用于排序、筛选、搜索、编辑和导航的System.Data.DataTable的可绑定数据的自定义视图。
所以我们在要用到对DataTable进行排序、筛选、搜索、编辑和导航操作时,就要想到用DataView.
2.public DataTable ToTable(bool distinct, params string[] columnNames)方法:
从参数名我们就可以猜出它的意思了。
distinct:表示返回的Data.DataTable是否包含所有列都具有不同值的行,默认为false。
columnNames:表示要包括在返回的System.Data.DataTable中的列名的列表。如果distinct为true,则它会根据columnNames指定的列名进行筛选过滤。
二、
三、
List
收集整理,非原创
1、用两层循环计算,前提条件是数据已经按分组的列排好序的。 DataTable dt = new DataTable(); dt.Columns.AddRange(new DataColumn[] { new DataColumn("name", typeof(string)), new DataColumn("sex", typeof(string)), new DataColumn("score", typeof(int)) }); dt.Rows.Add(new object[] { "张三","男",1 }); dt.Rows.Add(new object[] { "张三","男",4 }); dt.Rows.Add(new object[] { "李四","男",100 }); dt.Rows.Add(new object[] { "李四","女",90 }); dt.Rows.Add(new object[] { "王五","女",77 }); DataTable dtResult = dt.Clone(); for (int i = 0; i < dt.Rows.Count; ) { DataRow dr = dtResult.NewRow(); string name = dt.Rows[i]["name"].ToString(); string sex = dt.Rows[i]["sex"].ToString(); dr["name"] = name; dr["sex"] = sex; int score = 0; //内层也是循环同一个表,当遇到不同的name时跳出内层循环 for (; i < dt.Rows.Count; ) { if (name == dt.Rows[i]["name"].ToString()&&name == dt.Rows[i]["sex"].ToString()) { score += Convert.ToInt32(dt.Rows[i]["score"]); dr["score"] = score; i++; } else { break; } } dtResult.Rows.Add(dr); } dtResult中的数据即是最终结果。 2、 借助DataTable的Compute方法,DataTable中数据不用事先排好序。 DataTable dt = new DataTable(); dt.Columns.AddRange(new DataColumn[] { new DataColumn("name", typeof(string)), new DataColumn("sex", typeof(string)), new DataColumn("score", typeof(int)) }); dt.Rows.Add(new object[] { "张三","男",1 }); dt.Rows.Add(new object[] { "张三","男",4 }); dt.Rows.Add(new object[] { "李四","男",100 }); dt.Rows.Add(new object[] { "李四","女",90 }); dt.Rows.Add(new object[] { "王五","女",77 }); DataTable dtResult = dt.Clone(); DataTable dtName = dt.DefaultView.ToTable(true, "name","sex"); for (int i = 0; i < dtName.Rows.Count; i++) { DataRow[] rows = dt.Select("name='" + dtName.Rows[i][0] + "' and sex='" + dtName.Rows[i][1] + "'"); //temp用来存储筛选出来的数据 DataTable temp = dtResult.Clone(); foreach (DataRow row in rows) { temp.Rows.Add(row.ItemArray); } DataRow dr = dtResult.NewRow(); dr[0] = dtName.Rows[i][0].ToString(); dr[1] = temp.Compute("sum(score)", ""); dtResult.Rows.Add(dr); } 3、使用linq to DataTable group by实现 var query = from t in dt.AsEnumerable() group t by new { t1 = t.Field<string>("name"), t2 = t.Field<string>("sex") } into m select new { name = m.Key.t1, sex = m.Key.t2, score = m.Sum(n => n.Field<decimal>("score")) }; if (query.ToList().Count > 0) { query.ToList().ForEach(q => { Console.WriteLine(q.name + "," + q.sex + "," + q.score); }); }
DataTable dt = new DataTable("cart"); DataColumn dc1 = new DataColumn("areaid", Type.GetType("System.String")); DataColumn dc2 = new DataColumn("house", Type.GetType("System.String")); DataColumn dc3 = new DataColumn("seq", Type.GetType("System.String")); DataColumn dc4 = new DataColumn("remark", Type.GetType("System.String")); dt.Columns.Add(dc1); dt.Columns.Add(dc2); dt.Columns.Add(dc3); dt.Columns.Add(dc4); DataRow dr = dt.NewRow(); dr["areaid"] = "北京"; dr["house"] = "北京仓库"; dr["seq"] = "2"; dr["remark"] = "货到付款"; dt.Rows.Add(dr); DataRow dr1 = dt.NewRow(); dr1["areaid"] = "北京"; dr1["house"] = "上海仓库"; dr1["seq"] = "1"; dr1["remark"] = "货到付款"; dt.Rows.Add(dr1); DataRow dr2 = dt.NewRow(); dr2["areaid"] = "上海"; dr2["house"] = "上海仓库"; dr2["seq"] = "1"; dr2["remark"] = "货到付款"; dt.Rows.Add(dr2); DataRow dr3 = dt.NewRow(); dr3["areaid"] = "上海"; dr3["house"] = "北京仓库"; dr3["seq"] = "1"; dr3["remark"] = "货到付款"; dt.Rows.Add(dr3); var query = from t in dt.AsEnumerable() group t by new { t1 = t.Field<string>("areaid"), t2 = t.Field<string>("seq") } into m select new { areaid = m.Key.t1, seq = m.Key.t2, house = m.First().Field<string>("house"), rowcount = m.Count() }; Console.WriteLine("区域 " + " 库房" + " 数量"); foreach (var item in query.ToList()) { if (item.rowcount > 1) { MessageBox.Show(item.areaid + "---" + item.house); } Console.WriteLine(item.areaid + "---" + item.house + "---" + item.rowcount); Console.WriteLine("\r\n"); }
DataTable去除重复的方法:
一、ToTable方法来自动过滤所有重复行的数据,代码如下:
DataTable dt = "您的来源dt"; DataTable dt_new = dt.DefaultView.ToTable(true, "关键列1", "关键列2");
dt_new中存储的就是我们想要的所有不重复行的数据了。
public string[] GetNamesFromDataTable(DataTable dataTable) { DataView dv = dataTable.DefaultView; dataTable = dv.ToTable(true, "Name"); string[] names = new string[dataTable.Rows.Count]; for (int i = 0; i < names.Length; i++) { names[i] = dataTable.Rows[i][0].ToString(); } return names; }
讲解:
1.DefaultView的返回类型是DataView,而DataView的定义就是:
表示用于排序、筛选、搜索、编辑和导航的System.Data.DataTable的可绑定数据的自定义视图。
所以我们在要用到对DataTable进行排序、筛选、搜索、编辑和导航操作时,就要想到用DataView.
2.public DataTable ToTable(bool distinct, params string[] columnNames)方法:
从参数名我们就可以猜出它的意思了。
distinct:表示返回的Data.DataTable是否包含所有列都具有不同值的行,默认为false。
columnNames:表示要包括在返回的System.Data.DataTable中的列名的列表。如果distinct为true,则它会根据columnNames指定的列名进行筛选过滤。
二、
namespace ConsoleApplication2 { class Program { static void Main(string[] args) { DataTable tbl = new DataTable(); tbl.Columns.Add("Id", typeof(System.Int32)); tbl.Columns.Add("City", typeof(System.String)); tbl.Columns.Add("Province", typeof(System.String)); tbl.Rows.Add(1, "武汉", "湖北"); tbl.Rows.Add(2, "应城", "湖北"); tbl.Rows.Add(3, "武汉", "湖北"); IEnumerable <DataRow> r = tbl.AsEnumerable().Distinct(new CityComparer()); //到这一步,r里就是去重复的记录了 foreach (var item in r) { Console.WriteLine(item["Id"] + "," + item["City"] + "," + item["Province"]); } Console.ReadLine(); } } class CityComparer : IEqualityComparer <DataRow> { public bool Equals(DataRow r1, DataRow r2) { return r1["City"] == r2["City"]; } public int GetHashCode(DataRow obj) { return obj.ToString().GetHashCode(); } } }
三、
DataTable sourceDT = new DataTable("Table1"); sourceDT.Columns.Add("Id", System.Type.GetType("System.String")); sourceDT.Columns.Add("Name", System.Type.GetType("System.String")); sourceDT.Columns.Add("Age", System.Type.GetType("System.Int32")); sourceDT.Columns.Add("Sex", System.Type.GetType("System.String")); sourceDT.Rows.Add(new object[] { "10001", "李一", 24, "男" }); sourceDT.Rows.Add(new object[] { "10001", "王二", 23, "男" }); var groups = sourceDT.AsEnumerable().GroupBy(t => t["Id"].ToString()); foreach (var group in groups) { if (group.Count() > 1) { foreach (var row in group) { sourceDT.Rows.Remove(row); } } }
List
List<Act_TypeListInfo> listFind = listAllTZ.FindAll(delegate( Act_TypeListInfo f){ return f.MainID == iMainId && f.KeyName == info.ColKeyName && f.CompID == iCompID); } );
List<string> AllList = new List<string>(); var q = from p in AllList group p by p into g select new { Key = g.Count(), BranchName = g.Key }; foreach (var v in q) Console.WriteLine("--" + v.BranchName.ToString() + "--" + v.Key.ToString());
//******* 对集合按Name属于进行分组GroupBy查询 ******** //结果中包括的字段: //1、分组的关键字:Name = g.Key //2、每个分组的数量:count = g.Count() //3、每个分组的年龄总和:ageC = g.Sum(item => item.Age) //4、每个分组的收入总和:moneyC = g.Sum(item => item.Money) //写法1:lamda 表达式写法(推荐) var ls = persons1.GroupBy(a => a.Name).Select(g => (new { name = g.Key, count = g.Count(), ageC = g.Sum(item => item.Age), moneyC = g.Sum(item => item.Money) })); //写法2:类SQL语言写法 最终编译器会把它转化为lamda表达式 var ls2 = from ps in persons1 group ps by ps.Name into g select new { name = g.Key, count = g.Count(), ageC = g.Sum(item => item.Age), moneyC = g.Sum(item => item.Money) }; dataGridView1.DataSource = ls.ToList(); //dataGridView1.DataSource = ls2.ToList();
List<TestData> list = new List<TestData>(); list.Add(new TestData() { Name = "A", Count = 3, BatNum = "001" }); list.Add(new TestData() { Name = "A", Count = 3, BatNum = "001" }); list.Add(new TestData() { Name = "A", Count = 3, BatNum = "002" }); list.Add(new TestData() { Name = "b", Count = 3, BatNum = "001" }); list.Add(new TestData() { Name = "b", Count = 6, BatNum = "002" }); list.Add(new TestData() { Name = "b", Count = 3, BatNum = "003" }); list.Add(new TestData() { Name = "b", Count = 5, BatNum = "001" }); var Query = from l in list group l by l.Name + "_" + l.BatNum into g select new { Name = g.Key.Split('_')[0].ToString(), Count = g.Sum(x=>x.Count), BatNum = g.Key.Split('_')[1].ToString() }; foreach (var v in Query) { Console.WriteLine("Name={0} Count={1} BatNum={2}",v.Name,v.Count,v.BatNum); }
var query = from l in list group l by new { l.Name, l.BatNum } into g select new { Name = g.Key.Name, Count = g.Sum(a => a.Count), BatNum = g.Key.BatNum }; string result = ""; foreach (var q in query) { result += "Name=\"" + q.Name + "\"," + "Count=\"" + q.Count + "\"," + "BatNum=\"" + q.BatNum + " \"<br />"; }
List<Cart_Model> list_CartModel = new List<Cart_Model>(); /按店铺进行分组 IEnumerable<IGrouping<string, Cart_Model>> query = list_CartModel.GroupBy(pet => pet.ShopId, pet => pet); foreach (IGrouping<string, Cart_Model> info in query) { List<Cart_Model> sl = info.ToList<Cart_Model>();//分组后的集合 //也可循环得到分组后,集合中的对象,你可以用info.Key去控制 //foreach (KqiPageSetupInfo set in info) //{ //} }
//从List中查找另一个List的匹配项 var mnList = listFind.Where(d => listYQ.Select(d1 => d1.YQID).Contains(d.YQID)).ToList(); //或 (FindAll) var mnList = listFind.Where(delegate(T_MNYQInfo f) { foreach (var itemYq in listYQ) { if (f.YQID == itemYq.YQID) { return true; } } return false; }).ToList();
//List中查找不为空的数据,去除重复 var qu = list.Where(x => x.DataTime.HasValue).Select(y => y.DataTime.Value).OrderByDescending(z => z).Distinct(); var listDT = qu.ToList();
//List中按两个值排序 OrderBy先排序 List = List.OrderBy(p => p.id).ThenBy(p => p.sid).ToList();
//List分页 DataPager1.CurrentPageIndex当前页码 PageSize分页大小 var curMNList = mnList.Skip(PageSize * (DataPager1.CurrentPageIndex - 1)).Take(PageSize).ToList();
收集整理,非原创
相关文章推荐
- datatable使用groupby进行分组统计
- 如何在datatable中使用groupby进行分组统计
- datatable使用groupby进行分组统计
- C# datatable使用groupby进行分组统计
- Excel 中使用SQL 语句查询数据(八)-----用Group by 进行分组统计
- AC010笔记之一:解释SAP R/3使用下列各项对财务主记录进行分组的方法
- 对List进行子查询及分组
- Ruby on Rails,使用where方法对持久化对象进行条件查询
- Linq对DataTable或者集合的排序,Where筛选,分组,统计总数sum等操作
- 构造使用IN子句的动态Transact-SQL方法进行编号查询
- c#对List或ListArray或string组数 用linq进行分组统计
- 使用dcmtk进行worklist服务的测试方法
- List<T> 的条件筛选 where使用方法
- 解决 ”不允许在查询中显式构造实体类型“问题及使用其他方法实现返回 List<Model对象>或者IQueryable<Model对象>对象
- LING 分组统计查询、存为DataTable、查询DataTable
- 构造使用IN子句的动态Transact-SQL方法进行编号查询
- 在Sql的where中使用case进行不同字段筛选|Case的2种使用方法和一种少为人知的用途
- 使用Criteria进行分页查询通用方法提取
- 用Linq和Dataview筛选查询DataTable数据,DataTable和List相互转换