我是C#的初学者。
我遇到过这段代码:
List<RelatedProductViewModel> relatedProductViewModel = vm.RelatedProductID.Select(p => new RelatedProductViewModel { RelatedProductID = p, ProductID = vm.ProductID, Type = vm.Type }).ToList();
vm.RelatedProductID是一个int数组,只有一个元素(0),值为8666。
所以我认为Select是int数组中可用的方法,但我找不到任何关于此的文档。
任何人都可以启发我:
Select做了什么?
最终,我想弄清楚llambda表达式中p的值是多少 - 请不要对llambda表达式有太多技术性,因为我刚刚读过它们。
答案 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设置RelatedProductViewModel
和ProductID
;捕获&#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(原始代码)可以创建更清晰的代码。