[英]C# LINQ and func
這是我正在使用的簡化版本,目的只是讓您知道我正在嘗試完成的工作:
public Dictionary<int, Func<int>> Magic(Dictionary<int, int> dictionary)
{
return dictionary
.Select(v => new
{
key = v.Key,
function = new Func<int>(() => v.Value + 5) // *
})
.ToDictionary(v => v.key, v => v.function);
}
是否可以使標有(*)的行更短? 因為當我嘗試刪除多余的(我認為)委托創建時,它給出了錯誤:
function = () => v.Value + 5 // *
但是它不應該給出錯誤,很明顯返回的類型是...
Lambda表達式是無類型的。 這就是為什么您必須向編譯器添加一些信息來確定其類型(通過為它們提供一些上下文)的原因。
請注意,lambda表達式本身沒有類型,因為通用類型系統沒有“ lambda表達式”的內在概念。 但是,有時非正式地談論lambda表達式的“類型”有時很方便。 在這些情況下,類型是指將lambda表達式轉換為的委托類型或表達式類型。
您可以通過將其分配給的變量/參數/屬性/字段的類型來執行此操作:
Func<int> func = () => 5;
或將其投射給委托人:
var func = (Func<int>)(() => 5);
這是必要的,因為您可以想象將自己的委托聲明為
public delegate int MyDelegate();
編譯器如何知道您的匿名類型屬性是否應鍵入MyDelegate
或Func<int>
?
您可以將整個事情簡化為:
public Dictionary<int, Func<int>> Magic(Dictionary<int, int> dictionary)
{
return dictionary
.ToDictionary(v => v.Key, v => (Func<int>)(() => v.Value + 5));
}
但是您仍然需要顯式轉換為Func<int>
。
唯一的其他方法是這樣的:
public Dictionary<int, Func<int>> Magic(Dictionary<int, int> dictionary)
{
return dictionary
.ToDictionary<KeyValuePair<int, int>, int, Func<int>>(
v => v.Key,
v => () => v.Value + 5);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.