C# 如何在C中使用group by、having和sum by LINQ返回sum值#
我使用Group By和Sum By LINQ搜索了许多相关主题,但我不能在Group By、Having和Sum之间使用combo,然后返回INTEGER。有人能帮忙吗 我有一个数据表C# 如何在C中使用group by、having和sum by LINQ返回sum值#,c#,linq,C#,Linq,我使用Group By和Sum By LINQ搜索了许多相关主题,但我不能在Group By、Having和Sum之间使用combo,然后返回INTEGER。有人能帮忙吗 我有一个数据表 |---------------------|------------------| | Name | Count | |---------------------|------------------| | Apple |
|---------------------|------------------|
| Name | Count |
|---------------------|------------------|
| Apple | 34 |
|---------------------|------------------|
| Apple | 12 |
|---------------------|------------------|
| Orange | 10 |
|---------------------|------------------|
我想用LINQ(Group by、Having和Sum)返回关于苹果总量为46的整数
这是我的代码,但它无法运行
int total = dt.AsEnumerable().Where(tt => tt.Field<string>("Name") == "Apple")
.GroupBy(tt => tt.Field<string>("Name"))
.Sum(tt => Int32.Parse(tt.Field<string>("Count")))
int total=dt.AsEnumerable()。其中(tt=>tt.Field(“Name”)==“Apple”)
.GroupBy(tt=>tt.Field(“名称”))
.Sum(tt=>Int32.Parse(tt.Field(“Count”))
所有代码和问题
DataTable dt = new DataTable();
DataColumn col1 = new DataColumn("Name");
DataColumn col2 = new DataColumn("Count");
dt.Columns.Add(col1);
dt.Columns.Add(col2);
DataRow row = dt.NewRow();
row[col1] = "Apple";
row[col2] = 34;
dt.Rows.Add(row);
DataRow row1 = dt.NewRow();
row1[col1] = "Apple";
row1[col2] = 12;
dt.Rows.Add(row1);
DataRow row2 = dt.NewRow();
row2[col1] = "Orange";
row2[col2] = 10;
dt.Rows.Add(row2);
int total = dt.AsEnumerable().Where(tt => tt.Field<string>("Name") == "Apple")
.GroupBy(tt => tt.Field<string>("Name"))
.Sum(tt => Int32.Parse(tt.Field<string>("Count")));
DataTable dt=newdatatable();
DataColumn col1=新的DataColumn(“名称”);
DataColumn col2=新的DataColumn(“计数”);
dt.Columns.Add(col1);
dt.Columns.Add(col2);
DataRow row=dt.NewRow();
行[col1]=“苹果”;
行[col2]=34;
dt.行。添加(行);
DataRow row1=dt.NewRow();
行1[col1]=“苹果”;
行1[col2]=12;
dt.行。添加(第1行);
DataRow row2=dt.NewRow();
第2行[col1]=“橙色”;
row2[col2]=10;
dt.行。添加(第2行);
int total=dt.AsEnumerable()。其中(tt=>tt.Field(“Name”)==“Apple”)
.GroupBy(tt=>tt.Field(“名称”))
.Sum(tt=>Int32.Parse(tt.Field(“Count”));
错误:
严重性代码说明项目文件行抑制状态
错误CS1929“iGroup”不包含“Field”的定义,最佳扩展方法重载“DataRowExtensions.Field(DataRow,string)”需要“DataRow”WindowsFormsApplication1类型的接收器c:\users\admin\documents\visual studio 2015\Project\WindowsFormsApplication1\WindowsFormsApplication1\Form1.cs 46 Active
谢谢大家,您有一个逻辑问题,这不是“无法运行”的原因。因为你只想还苹果,所以没有必要分组。简单总结一下!如果要返回不同产品的总计数,则必须按产品分组 然后您需要使用一个类型参数来
字段
,该参数与表列的类型匹配。如果有int
表列(SQL Server或数字长访问),则必须使用字段
int total=dt.AsEnumerable()
.Where(row=>row.Field(“名称”)==“苹果”)
.Sum(行=>行字段(“计数”);
还要注意,在C#中,默认的字符串比较模式是区分大小写的。因此,请确保列名和筛选器值大小写正确
还要注意,GroupBy返回的是
IEnumerable
,而不是IEnumerable
!因此,您需要像这样工作:
var totals = dt.AsEnumerable()
.GroupBy(row => row.Field<string>("Name")
.Select(g => new { Name = g.Key, Total = g.Sum(row => row.Field<int>("Count")));
var totals=dt.AsEnumerable()
.GroupBy(行=>row.Field(“名称”)
.Select(g=>new{Name=g.Key,Total=g.Sum(row=>row.Field(“Count”));
i分组
具有一个键
属性,并实现了一个IEnumerable
。因此,您可以对其应用Sum
函数
这将返回具有名称
和总计
属性的匿名类型的枚举
SQL中WHERE和HAVING的区别在于WHERE是在分组之前执行的,HAVING是在分组之后执行的。在LINQ中,这些函数总是在
GroupBy
之前或GroupBy
之后应用的WHERE
函数。这意味着您可以在DataRow
上应用一个WHERE
e> GroupBy,或GroupBy
之后的Where
应用于i分组
s。您甚至可以在选择
之后有一个Where
(如果您没有使用LINQ to EF或其他LINQ to数据库,例如,如果您没有使用O/R映射器)。如果计数是数字类型,则会更容易一些(否则您可以使用Convert.ToInt32(r[“Count”])
)
DataTable dt=newdatatable();
默认情况下,dt.Columns.Add(“Name”);//typeof(string)
dt.Columns.Add(“Count”,typeof(int));//指定数字类型
添加(“苹果”,34);
添加(“苹果”,12);
dt.行。添加(“橙色”,10);
//要仅对Apple的计数求和,请执行以下操作:
int applecoount=dt.Rows.Cast().Sum(r=>Apple.Equals(r[0])?(int)r[1]:0);
//或按名称分组(如果需要多个名称的计数)
var lookup=dt.Rows.Cast().ToLookup(r=>r[0]作为字符串,r=>(int)r[1]);
int iAppleCount=lookup[“Apple”].Sum();//46
int iOrangeCount=查找[“橙色”].Sum();//10
//如果Count是数值tupe,也可以这样计算:
var oAppleCount=dt.Compute(“总和(计数)”,“名称='Apple'”;//46(对象{long})
在你有另一篇你认为需要删除的被否决的帖子之前,你应该先阅读并接受。我很抱歉:(格式不是主要问题。阅读并接受:这表明不费吹灰之力“无法运行”意味着什么。你是否遇到编译器错误(哪一个?)或运行时异常(哪一个?)或者只是没有得到预期的结果?count真的是一个字符串吗?你的意思是如果返回一个新的数据表,我应该使用Group By、Having和Sum吗?那么你能给我一个在LINQ中使用Group By、Having和Sum的例子吗?顺便说一句,区分大小写与.NET中的默认字符串比较无关。列名没有匹配大小写,但列索引查找在匹配时更快。我指的是C#中的默认字符串比较模式,例如,与VBA相比,其中字符串比较默认不区分大小写。但在VB和VBA中默认也区分大小写。好吧,C#和VB.Net中的字符串比较使用相同的System.string.Equals(String,String)
方法,当您检查生成的IL时。是的,VB.NET;但是,VBA是Visual Basic 6.0 for applications,与.NETso无关。如何在许多条件下使用代码,例如名称为apple,createdate>2016@Kien答案将取决于太多的人
var totals = dt.AsEnumerable()
.GroupBy(row => row.Field<string>("Name")
.Select(g => new { Name = g.Key, Total = g.Sum(row => row.Field<int>("Count")));
DataTable dt = new DataTable();
dt.Columns.Add("Name"); // typeof(string) by default
dt.Columns.Add("Count", typeof(int)); // specify numeric type
dt.Rows.Add("Apple", 34);
dt.Rows.Add("Apple", 12);
dt.Rows.Add("Orange", 10);
// to sum the Count only for Apple:
int AppleCount = dt.Rows.Cast<DataRow>().Sum(r => "Apple".Equals(r[0]) ? (int)r[1] : 0);
// or group by Name if you need the Count of more than one Name
var lookup = dt.Rows.Cast<DataRow>().ToLookup(r => r[0] as string, r => (int)r[1]);
int iAppleCount = lookup["Apple"].Sum(); // 46
int iOrangeCount = lookup["Orange"].Sum(); // 10
// if Count is numeric tupe, you can also Compute them like this:
var oAppleCount = dt.Compute("Sum(Count)", "Name = 'Apple'"); // 46 (object {long})