您的位置:首页 > 其它

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

2014-08-29 09:42 579 查看
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);
});
}


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


收集整理,非原创
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: