2015-06-10 56 views
1

我一直在尋找一個解決方案,每個對象的屬性轉換上的列表一些陣列時終於讓我找到this將對象列表轉換爲c#中的數組 - 「x => x.Name」語法的含義是什麼?

然後我發現這個代碼

MyList.Select(x=>x.Name).ToArray(); 

這是解決我的問題。但我仍然不明白變量'x'的含義。任何人都可以簡單地向我解釋這個語法是如何工作的?

+0

x表示在MYLIST元件... –

+0

在運算符左側的x是對應於輸入變量x在查詢表達式中。 – CodingDefined

+1

這是一個lambda表達式。請參閱https://msdn.microsoft.com/en-us/library/bb397687.aspx –

回答

4

LINQ .Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)擴展方法需要一個Func,它接受一個參數並返回另一個(甚至相同)類型的對象/值。

您有幾種方式來指定哪些函數來執行對您的枚舉每個項目:

  • Lambda表達式:你在你的問題發佈什麼。 x => x.Namex是輸入參數,x.Name是結果。也可以寫成lambda語句:x => { return x.Name; }。 Lambda表達式是編寫只能使用一次的簡短方法的一種非常簡潔的方式。 (另外,他們收集他們的周圍範圍在關閉 - 但這是不相關的在您的問題的上下文中)
  • 匿名委託:大體上與上述相同。將寫爲delegate(YourType x) { return x.Name; }
  • 方法組:在其他位置定義一個命名方法,並指定其名稱:.Select(this.SelectName)SelectName將被寫爲:

    private string SelectName(YourType x) { 
        return x.Name; 
    } 
    

LINQ擴展方法一般工作於的IEnumerable<T>實例,所以任何類型的(主要是集合),它可以重複/枚舉。 .Select()用於IEnumerable<TSource>類型的一個可枚舉變換IEnumerable<TResult>類型的另一枚舉。請注意,一旦可枚舉被枚舉(通過foreach.ToList(),.ToArray()或其他),將僅執行selector函數作爲參數傳遞給.Select()

使用LINQ,您更專注於以數據爲中心的視圖類型。您不在乎.Select()內部是否使用foreach,for或任何其他方式訪問您收藏的項目。它甚至可能並行操作(.AsParallel)。

當然,最LINQ調用可以用簡單的碼被改寫,例如:

var nameList = List<String>(MyList.Count); 
foreach(var item in MyList) { 
    nameList.Add(item.Name); 
} 

var array = nameList.ToArray(); // this is still LINQ, 
           // but I didn't want to bother 
           // with re-allocating the array 
           // or with using indexing 
+0

在最後一段代碼中輸入錯字。在函數體中,你的意思是說x.Name。我投票了,因爲你給所有可能的方式來傳遞參數來選擇。 –

+0

@ Khnle-Kevin:謝謝,我已經更新了我的問題。希望所有參數具有相同的名稱並錯過更新方法主體。 – knittl

0

這是一個lambda expression in c#

lambda表達式是一個匿名函數,您可以使用該函數來創建委託或表達式樹類型 。通過使用lambda表達式 ,你可以寫,可以作爲 參數傳遞或返回函數調用的價值本地函數。 LAMBDA 表達式是寫LINQ查詢表達式 特別有幫助。要創建lambda表達式,可以在lambda運算符左側指定輸入 參數(如果有)=>,並且將表達式或語句塊放在另一側。對於 例如,lambda表達式X => X * X指定的參數這是 命名爲x,並返回x的值的平方。

相關問題