0

我遇到了一段我无法弄清楚甚至可能不起作用的代码。您可以在下面找到代码。

我试图在上下文中弄清楚的代码

该方法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>

尽管如此,我仍然认为该语句仍然无效,因为 tSource 基础对象 DataRow 没有属性Index

    var tResult = GetDataTable().Select(
                      (tSource, tResult) => { return new { tSource.Index }; }
                      );

这个假设正确吗?

4

2 回答 2

2

Select您使用的是,因为AsEnumerable()IEnumerable.Select<T>的返回值是.IEnumerable<T>

于 2013-07-13T10:33:25.490 回答
1

两者都是导致匿名对象的 lambdas。此外,两者都以非常简洁的形式编写,完整的形式是:

(s) => { return new { s.Index }; }

第二个是等价的。

两个 lambda 都是Func<>代表,具有不同的签名。

一个 lambda 可以产生一个字符串,但这取决于你使用它的目的(类型推断在这里是一件大事,也是 lambda 非常简洁的原因之一)。

lambda 的返回类型取决于您在其中使用它的上下文 - 它可以是委托,但在您的情况下,它不是。一个 lambda 虽然是一个委托 - 如果它有一个返回类型,它是 a Func<T1, T2, ... Tn, TReturn>,如果它没有,它是Action<T1,T2,..., Tn>.

于 2013-07-13T10:30:48.330 回答