c#字典构造函数,它接受Func作为钥匙

本文关键字:bool string 钥匙 Func 构造函数 字典 | 更新日期: 2023-09-27 18:12:04

我一直在通过一个关于s.o.i.d原则的techhed,我对一段代码有点困惑。我有点困惑,不知道该如何表达这个问题。

我确实知道委托和泛型是如何工作的,但我不知道这家伙是如何向字典添加值的。源代码如下:

//Part of a static module/class outside the main program
private static readonly Dictionary<Func<string, bool>, IInputRetriever> InputRetrievers = new Dictionary<Func<string, bool>, IInputRetriever>(); 
//inside the same module/class at the source code above
public static IInputRetriever ForFileName(string filename)
    {
        return InputRetrievers.First(x => x.Key(filename)).Value;
    }
//Also inside the static class mentioned above
public static void RegisterInputRetriever(Func<string, bool> evaluator, IInputRetriever inputRetriever)
    {
        InputRetrievers.Add(evaluator, inputRetriever);
    }
//Called in the main program
private static void ConfigureStorage()
    {
        var blobStorage = new BlobDocumentStorage(ConfigurationManager.AppSettings["storageAccount"], ConfigurationManager.AppSettings["storageKey"]);
        var fileStorage = new FileDocumentStorage();
        var httpInputRetriever = new HttpInputRetriever();
        InputRetriever.RegisterInputRetriever(x => x.StartsWith("http"), httpInputRetriever);
        InputRetriever.RegisterInputRetriever(IsBlobstorageUrl, blobStorage);
        InputRetriever.RegisterInputRetriever(x => true, fileStorage);
        DocumentPersister.RegisterDocumentPersister(IsBlobstorageUrl, blobStorage);
        DocumentPersister.RegisterDocumentPersister(x => true, fileStorage);
    }
//Still inside the main program
    private static bool IsBlobstorageUrl(string str)
    {
        var storageAccount = ConfigurationManager.AppSettings["storageAccount"];
        return str.StartsWith(string.Format("https://{0}.blob.core.windows.net/", storageAccount));
    }
//Called in another module/class
var inputRetriever = InputRetriever.ForFileName(sourceFileName);

我想我想知道的是,inputretriievers字典如何知道每个条目使用什么键?

我最初的想法是inputretriievers。添加("关键",价值);在这种情况下,一个委托被用来填充键,这就是我困惑的地方。

c#字典构造函数,它接受Func<string,bool>作为钥匙

此方法:

public static IInputRetriever ForFileName(string filename)
{
    return InputRetrievers.First(x => x.Key(filename)).Value;
}

将循环遍历所有字典条目并执行每个键的Func<string, bool>,直到找到命中(即当Func为filename返回true时)。然后它将返回值