我一直在尋找一個解決方案,每個對象的屬性轉換上的列表一些陣列時終於讓我找到this將對象列表轉換爲c#中的數組 - 「x => x.Name」語法的含義是什麼?
然後我發現這個代碼
MyList.Select(x=>x.Name).ToArray();
這是解決我的問題。但我仍然不明白變量'x'的含義。任何人都可以簡單地向我解釋這個語法是如何工作的?
我一直在尋找一個解決方案,每個對象的屬性轉換上的列表一些陣列時終於讓我找到this將對象列表轉換爲c#中的數組 - 「x => x.Name」語法的含義是什麼?
然後我發現這個代碼
MyList.Select(x=>x.Name).ToArray();
這是解決我的問題。但我仍然不明白變量'x'的含義。任何人都可以簡單地向我解釋這個語法是如何工作的?
LINQ .Select<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector)
擴展方法需要一個Func,它接受一個參數並返回另一個(甚至相同)類型的對象/值。
您有幾種方式來指定哪些函數來執行對您的枚舉每個項目:
x => x.Name
:x
是輸入參數,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
在最後一段代碼中輸入錯字。在函數體中,你的意思是說x.Name。我投票了,因爲你給所有可能的方式來傳遞參數來選擇。 –
@ Khnle-Kevin:謝謝,我已經更新了我的問題。希望所有參數具有相同的名稱並錯過更新方法主體。 – knittl
lambda表達式是一個匿名函數,您可以使用該函數來創建委託或表達式樹類型 。通過使用lambda表達式 ,你可以寫,可以作爲 參數傳遞或返回函數調用的價值本地函數。 LAMBDA 表達式是寫LINQ查詢表達式 特別有幫助。要創建lambda表達式,可以在lambda運算符左側指定輸入 參數(如果有)=>,並且將表達式或語句塊放在另一側。對於 例如,lambda表達式X => X * X指定的參數這是 命名爲x,並返回x的值的平方。
x表示在MYLIST元件... –
在運算符左側的x是對應於輸入變量x在查詢表達式中。 – CodingDefined
這是一個lambda表達式。請參閱https://msdn.microsoft.com/en-us/library/bb397687.aspx –