2014-03-31 11 views
2

我是C#的初學者。Select方法在c#int數組上做什麼

我所遇到的這一段代碼:

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

['Enumerable.Select'](http://msdn.microsoft.com/en-us/library/system.linq.enumerable.select%28v=vs.110%29.aspx)? –

+3

這是'Enumerable'類中的'IEnumerable '的擴展方法(http://msdn.microsoft.com/en-us/library/system.linq.enumerable_methods(v = vs.110).aspx )在'System.Linq'命名空間中。 –

+0

這是一個Linq擴展方法,它適用於實現IEnumerable <>的任何集合。像數組一樣。許多可用的資源解釋Linq。 –

回答

3

選擇是IEnumerable<T>部分的列表。數組創建時自動實現IEnumerable<T>,因此它實現它,.Select()從那裏可用。

但選擇是投影從一套到另一套的結果。它每個迭代值返回1個結果。

當使用。在IQueryable<T>上選擇時,它在內部可能會稍有不同。它在迭代時檢索它們,就像yield一樣。

通過在最後使用ToList(),您迫使其一舉枚舉所有結果。對於內存類型來說這很快,但對於在檢索項目時有延遲的數據庫或資源,這可能會對性能產生很大影響。

+1

由於接口沒有方法定義,它在技術上並不是「IEnumerable ''的一部分;它實際上是'IEnumerable '上的[*擴展方法*](http://msdn.microsoft.com/en-us//library/bb383977.aspx)。 –

+0

@DanPuzey:謝謝澄清,我會留下完整的答案,所以其他讀者可以從您的評論中學習。 –

+0

_When使用。選擇IQueryable 時,在內部它可能稍有不同。它在迭代時檢索它們,就像一個良率一樣._並不是真的。迭代'IEnumerable '也會在元素迭代時檢索元素。區別在於'IQueryable '提供了一種將投影或過濾器「移動」回源的機制。這允許將LINQ語句轉換爲例如SQL並在數據庫服務器上評估以獲得更好的性能。 –

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成爲新RelatedProductViewModelRelatedProductID,具有ProductIDType通過「捕獲」值vm設置。

所以,在你的榜樣輸出將是長度爲1,如該單個項目有RelatedProductID的8666

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(原始代碼)會創建更清晰的代碼。

相關問題