--------关于LINQ中let的理解--------

EnForGrass 2012-04-12 03:45:06
加精
刚刚回答了一个帖子,地址:http://topic.csdn.net/u/20120412/14/3ef7786f-f9a9-4c00-86ca-6867439ac77c.html?493,内容如下:
例如:
批号 数量
0001 100
0002 200
0001 300
0002 400
0003 500
在DataTable中显示是这样的结果,现在在DataTable中根据批号分组汇总数量
由于初学Linq,需要多学学。我的写法是这样:

DataTable dt = new DataTable();
dt.Columns.Add("批号", typeof(string));
dt.Columns.Add("数量", typeof(int));
DataRow dr1 = dt.NewRow();
dr1["批号"] = "0001";
dr1["数量"] = 100;
dt.Rows.Add(dr1);

DataRow dr2 = dt.NewRow();
dr2["批号"] = "0002";
dr2["数量"] = 200;
dt.Rows.Add(dr2);

DataRow dr3 = dt.NewRow();
dr3["批号"] = "0001";
dr3["数量"] = 300;
dt.Rows.Add(dr3);

DataRow dr4 = dt.NewRow();
dr4["批号"] = "0002";
dr4["数量"] = 400;
dt.Rows.Add(dr4);

DataRow dr5 = dt.NewRow();
dr5["批号"] = "0003";
dr5["数量"] = 500;
dt.Rows.Add(dr5);
var sumObject = dt.Compute("Sum(数量)", "");
var vardt = from p in dt.AsEnumerable()
group p by p.ItemArray[0] into g
let sum = g.Sum(x => int.Parse(x.ItemArray[1].ToString()))
select new
{
批号 = g.Key,
Sum = sum
};
foreach (var outputvar in vardt)
{
MessageBox.Show(outputvar.批号 + " " + outputvar.Sum);
}

如上代码,比较关键的地方就是 let sum = g.Sum(x => int.Parse(x.ItemArray[1].ToString()))的用法,我现在对let的理解就是对子查询的结果取的一个别名。相当于如下代码(没有分组)

var qureysum = (from p in dt.AsEnumerable()
select p.ItemArray[1]).Sum(x => int.Parse(x.ToString()));

不知道理解的对不?请大家看看,说说let的更深层次的理解。谢谢!!!!
...全文
2529 60 打赏 收藏 转发到动态 举报
写回复
用AI写文章
60 条回复
切换为时间正序
请发表友善的回复…
发表回复
larissa523 2012-04-19
  • 打赏
  • 举报
回复
学习了。
yojinlin 2012-04-19
  • 打赏
  • 举报
回复
學習了。
huanyingzhanxian 2012-04-19
  • 打赏
  • 举报
回复
还不错 呀 真是的
7271747 2012-04-18
  • 打赏
  • 举报
回复
- -LINQ强大的地方在
LINQ TO OBJECT
而这个
LINQ TO SQL属于LINQ失败的一个地方- -至少我的感觉如此。

比如caozhy的例子,如果用在XML上,我想LZ就会明白,LINQ有多好用了。
TZRyeman 2012-04-18
  • 打赏
  • 举报
回复
有没有其他使用场景呢?
liouse 2012-04-18
  • 打赏
  • 举报
回复
路过学习了。linq的 let
lsplc 2012-04-17
  • 打赏
  • 举报
回复
纯粹顶帖 希望那个大家能看到
dayutek 2012-04-17
  • 打赏
  • 举报
回复
学习中
kofkyo 2012-04-16
  • 打赏
  • 举报
回复
学习了,LINQ还是不太熟
new_fengzi 2012-04-15
  • 打赏
  • 举报
回复
谢谢分享,学习!!
CXW15539649600 2012-04-15
  • 打赏
  • 举报
回复
不懂啊
wjf923 2012-04-14
  • 打赏
  • 举报
回复
谢谢分享,学习!!
rmyx1981 2012-04-14
  • 打赏
  • 举报
回复
感谢,有收获!
xiven 2012-04-13
  • 打赏
  • 举报
回复
来学习一下LINQ,好资源啊!
hao603324 2012-04-13
  • 打赏
  • 举报
回复
来学习一下LINQ,好资源啊!
owen_chen007 2012-04-13
  • 打赏
  • 举报
回复
都忘的差不多了
mengyu3013 2012-04-13
  • 打赏
  • 举报
回复
正好学习一下。
threenewbee 2012-04-13
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
一旦用值初始化了该范围变量,它就不能用于存储其他值。 但如果该范围变量存储的是可查询的类型,则可以对其进行查询。
[/Quote]
这个从它的实现原理中也很好理解。匿名对象的属性是只读的。
var x = new { Name = "x" };
x.Name = "y"; // error
Louis军 2012-04-13
  • 打赏
  • 举报
回复
var var1 = list.GroupBy(n => n.ID).Select(n => new { ID = n.Key, Count = n.Sum(m => m.Count) });
q107770540 2012-04-13
  • 打赏
  • 举报
回复
好像已经有答案了,路过,学习
加载更多回复(17)
C#5.0本质论第四版,高清扫描的,对C#5.0技术讲的比较详细,第1章 C#概述 1 1.1 Hello,World 1 1.2 C#语法基础 3 1.2.1 C#关键字 3 1.2.2 标识符 4 1.2.3 类型定义 5 1.2.4 Main 6 1.2.5 语句和语句分隔符 7 1.2.6 空白 8 1.2.7 使用变量 8 1.2.8 数据类型 9 1.2.9 变量的声明 9 1.2.10 变量的赋值 10 1.2.11 变量的使用 11 1.3 控制台输入和输出 11 1.3.1 从控制台获取输入 11 1.3.2 将输出写入控制台 12 1.3.3 注释 14 1.3.4 托管执行和公共语言基础结构 16 1.3.5 C#和.NET版本 17 1.3.6 CIL和ILDASM 18 1.4 小结 20 第2章 数据类型 21 2.1 基本数值类型 21 2.1.1 整数类型 22 2.1.2 浮点类型 23 2.1.3 decimal类型 23 2.1.4 字面值 24 2.2 更多基本类型 27 2.2.1 布尔类型 27 2.2.2 字符类型 27 2.2.3 字符串 29 2.3 null和void 34 2.3.1 null 34 2.3.2 void 35 2.4 类型的分类 37 2.4.1 值类型 37 2.4.2 引用类型 37 2.5 可空修饰符 38 2.6 数据类型之间的转换 39 2.6.1 显式转型 39 2.6.2 隐式转型 41 2.6.3 不使用转型操作符的类型转换 42 2.7 数组 43 2.7.1 数组的声明 44 2.7.2 数组的实例化和赋值 45 2.7.3 数组的使用 48 2.7.4 字符串作为数组使用 52 2.7.5 常见数组错误 53 2.8 小结 55 第3章 操作符和控制流 57 3.1 操作符 57 3.1.1 一元操作符正和负 58 3.1.2 二元算术操作符 58 3.1.3 复合赋值操作符 64 3.1.4 递增和递减操作符 65 3.1.5 常量表达式和常量符号 68 3.2 控制流程概述 69 3.2.1 if语句 70 3.2.2 嵌套if 71 3.3 代码块 73 3.4 代码块、作用域和声明空间 74 3.5 布尔表达式 76 3.5.1 关系操作符和相等性操作符 77 3.5.2 逻辑布尔操作符 77 3.5.3 逻辑求反操作符 78 3.5.4 条件操作符 79 3.5.5 空接合操作符 80 3.6 按位操作符 80 3.6.1 移位操作符 81 3.6.2 按位操作符 82 3.6.3 按位赋值操作符 83 3.6.4 按位取反操作符 84 3.7 控制流语句(续) 84 3.7.1 while和do while循环 84 3.7.2 for循环 86 3.7.3 foreach循环 88 3.7.4 switch语句 90 3.8 跳转语句 92 3.8.1 break语句 92 3.8.2 continue语句 94 3.8.3 goto语句 95 3.9 C#预处理指令 97 3.9.1 排除和包含代码 98 3.9.2 定义预处理符号 98 3.9.3 生成错误和警告 99 3.9.4 关闭警告消息 99 3.9.5 nowarn:选项 99 3.9.6 指定行号 100 3.9.7 可视编辑器提示 100 3.10 小结 101 第4章 方法和参数 103 4.1 方法的调用 104 4.1.1 命名空间 105 4.1.2 类型名称 106 4.1.3 作用域 107 4.1.4 方法名称 107 4.1.5 形参和实参 107 4.1.6 方法返回值 107 4.1.7 语句与方法调用的比较 108 4.2 方法的声明 108 4.2.1 形式参数声明 109 4.2.2 方法返回类型声明 110 4.3 using指令 111 4.4 Main()的返回值和参数 114 4.5 方法的参数 116 4.5.1 值参数 116 4.5.2 引用参数(ref) 117 4.5.3 输出参数(out) 118 4.5.4 参数数组 120 4.6 递归 122 4.7 方法重载 124 4.8 可选参数 126 4.9 用异常实现基本错误处理 129 4.9.1 捕捉错误 130 4.9.2 使用throw语句报告错误 136 4.10 小结 138 第5章 类 139 5.1 类的定义和实例化 141 5.2 实例字段 144 5.2.1 实例字段的声明 144 5.2.2 实例字段的访问 144 5.3 实例方法 145 5.4 使用this关键字 146 5.5 访问修饰符 151 5.6 属性 153

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧