Select方法在c#int数组上做了什么

时间:2014-03-31 11:42:15

标签: c#

我是C#的初学者。

我遇到过这段代码:

List<RelatedProductViewModel> relatedProductViewModel = vm.RelatedProductID.Select(p => new RelatedProductViewModel { RelatedProductID = p, ProductID = vm.ProductID, Type = vm.Type }).ToList();

vm.RelatedProductID是一个i​​nt数组,只有一个元素(0),值为8666。

所以我认为Select是int数组中可用的方法,但我找不到任何关于此的文档。

任何人都可以启发我:

Select做了什么?

最终,我想弄清楚llambda表达式中p的值是多少 - 请不要对llambda表达式有太多技术性,因为我刚刚读过它们。

3 个答案:

答案 0 :(得分:6)

Select创建投影;意思是,你提供一个函数,它接受int并输出某些东西,然后对于数组中的每个int,它执行该函数。基本上就是这样:

static IEnumerable<TResult> Select<TSource,TResult>(
      this IEnumerable<TSource> source, Func<TSource,TResult> selector)
{
    foreach(TSource item in source)
        yield return selector(source);
}

在您的情况下,每个选择器是:

p => new RelatedProductViewModel { RelatedProductID = p,
                 ProductID = vm.ProductID, Type = vm.Type }

含义:数组中的每个值p都成为新RelatedProductID的{​​{1}},并通过&#34设置RelatedProductViewModelProductID ;捕获&#34;价值Type

因此,示例中的输出将是长度为1的列表,其中单个项目的vm为8666。

答案 1 :(得分:3)

选择是IEnumerable<T>的一部分。数组在创建时会自动实现IEnumerable<T>,因此在实现它时,可以从那里获得.Select()。

但是选择投影从一组投射到另一组。每个迭代值返回1个结果。

使用。{选择IQueryable<T>时,内部可能会略有不同。它在迭代时检索它们,就像yield那样。

最后使用ToList(),你强迫它一次性枚举所有结果。对于内存类型,这很快,但对于在检索项目时有延迟的数据库或资源,这会对性能产生很大影响。

答案 2 :(得分:2)

代码是等效的(但与以下代码完全相同):

List<RelatedProductViewModel> relatedProductViewModel
  = new List<RelatedProductViewModel>();
foreach (var p in vm.RelatedProductID) {
  relatedProductViewModel.Add(
    new RelatedProductViewModel {
      RelatedProductID = p,
      ProductID = vm.ProductID,
      Type = vm.Type
    }
  );
}

Select 投影源序列中的项目(relatedProductViewModel)转换为新的元素序列。然后,投影序列按ToList()转换为列表并存储在relatedProductViewModel

如您所见,使用LINQ(原始代码)可以创建更清晰的代码。