簡體   English   中英

C#LINQ和func

[英]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表達式轉換為的委托類型或表達式類型。

來自Lambda Expressions(C#編程指南)

您可以通過將其分配給的變量/參數/屬性/字段的類型來執行此操作:

Func<int> func = () => 5;

或將其投射給委托人:

var func = (Func<int>)(() => 5);

這是必要的,因為您可以想象將自己的委托聲明為

public delegate int MyDelegate();

編譯器如何知道您的匿名類型屬性是否應鍵入MyDelegateFunc<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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM