DataTable、List使用groupby进行分组和分组统计;List、DataTable查询筛选方法

DataTable分组统计:

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);
    });
} 
//分组统计按次数排序
Dictionary<string, string> dicProjectExpectFiveParam = listProject.GroupBy(x => new { x.LHCodeID, x.ParamName })
                                                                           .Where(p => !sFiveParam.Contains(p.Key.LHCodeID))
                                                                           .Select(group => new { group.Key, LHCodeIDCount = group.Count() })
                                                                           .OrderByDescending(t => t.LHCodeIDCount)
                                                                           .ToDictionary(o => o.Key.LHCodeID, p => p.Key.ParamName);
            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("区域 " + "&nbsp; 库房" + "&nbsp;&nbsp; 数量");
            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 />";
        }

 

//linq多表关联分组排序统计
                var temp = from ta in areaList
                           join tb in StationList on ta.AreaID equals tb.AreaID
                           join tc in dcMNComple on tb.MN equals tc.Key into temp1
                           //orderby ta.AreaID 
                           group temp1 by new { AreaName = ta.AreaName, AreaID = ta.AreaID } into temp2
                           select new
                           {
                               AreaName = temp2.Key.AreaName,
                               AreaID = temp2.Key.AreaID,
                               MNCount = temp2.Count(),
                               Comple = temp2.Sum(s => s.Sum(t => t.Value))
                           };

 

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

 

List分组

//分组筛选 查询确定唯一数据
            var sums = listCount[0].listType.GroupBy(x => new { x.MainID, x.CompID }).Select(group => new
                                                                                                         {
                                                                                                             MainID = group.Key.MainID,
                                                                                                             CompID = group.Key.CompID
                                                                                                         });
            //时间分组模式
            Func<DataEntity, DateTime> groupBy1 = x => x.DataTime.Date;
            Func<DataEntity, DateTime> groupBy2 = x => new DateTime(x.DataTime.Year, x.DataTime.Month, 1);
            Func<DataEntity, DateTime> groupBy3 = x => new DateTime(x.DataTime.Year, 1, 1);
            //如果指定了时间间隔,就用开始时间,按照特定间隔来分组
            if (span > 1)
            {
                dtStart = dtStart.Date;
                groupBy1 = x => dtStart.AddDays(((x.DataTime.Date - dtStart).Days / span) * span);
                groupBy2 = x => new DateTime(dtStart.Year, dtStart.Month + ((x.DataTime.Month - dtStart.Month) / span) * span, 1);
                groupBy3 = x => new DateTime(dtStart.Year + ((x.DataTime.Year - dtStart.Year) / span) * span, 1, 1);
            }
            var groupByChoice = groupByType == 1 ? groupBy1 : (groupByType == 2 ? groupBy2 : groupBy3);

            var luTime = grMN.ToLookup(groupByChoice);

 

/*List对比所有项,判断 listMN1是否所有项存在于 listMN2*/
 List<string> listMN1 = new List<string>(){
                "399435XYX00003",
                "399435XYX00001",
                "399435XYX00002",
                "399435XYXKL117"
            };
            List<string> listMN2 = new List<string>(){
                "399435XYXKL117",
                "399435XYX00003",
                "399435XYX00001",
                "399435XYX00002",
                "xxxx",
            };

if (listMN1.All(listMN2.Contains))    //true

 

 收集整理,非原创

 

转载于:https://www.cnblogs.com/elves/p/3944220.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值