我遇到了一段我无法弄清楚甚至可能不起作用的代码。您可以在下面找到代码。
我试图在上下文中弄清楚的代码
该方法GetDataTableData()
返回一个System.Data.DataTable
该方法返回一个DataRow对象Select(...)
数组: 。据我所知, Select() 中的 lambda 无效。DataRow[] rows
var table = GetDataTableData()
.Select(s => new { s.Index })
.AsEnumerable()
.Select(
(s, counter) => new { s.Index, counter = counter + 1 }
);
我的问题:这个 lambda 做什么 - 它甚至有效/有效吗?
该方法Select(...)
有几个重载,它们都以字符串类型开头。
- lambda 表达式可以是字符串类型吗?
- 什么是 lambda 的返回类型 - 总是一个委托?
这里有问题的行从上面
// of what type is this (a delegate?)
s => new { s.Index }
...
// and what does this
(s, counter) => new { s.Index, counter = counter + 1 }
阅读以下答案后更新
据我了解,至少第二个 Select 指的是IEnumerable.Select<T>
. 但是调用AsEnumerable()
集合不会改变底层类型:
// calling AsEnumberable() does not change type
IEnumerable<DataRow> enumDataRows = GetDataTable().AsEnumerable();
Type type = enumDataRows.GetType().GetGenericArguments()[0];
type.Dump(); // still returns DataRow
因此,属性 Index 必须存在于基础类型中,lambda 表达式(s) => { return new { s.Index }; }
才能工作。
这个假设正确吗?
关于第一个选择
我如何识别它是内置Select()
方法还是可枚举方法Enumerable.Select<TSource, TResult>
- 无论是
IEnumerable<TSource>, Func<TSource, TResult>
- 或者
IEnumerable<TSource>, Func<TSource, Int32, TResult>
尽管如此,我仍然认为该语句仍然无效,因为 tSource 基础对象 DataRow 没有属性Index
:
var tResult = GetDataTable().Select(
(tSource, tResult) => { return new { tSource.Index }; }
);
这个假设正确吗?