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。添加("关键",价值);在这种情况下,一个委托被用来填充键,这就是我困惑的地方。
此方法:
public static IInputRetriever ForFileName(string filename)
{
return InputRetrievers.First(x => x.Key(filename)).Value;
}
将循环遍历所有字典条目并执行每个键的Func<string, bool>
,直到找到命中(即当Func为filename
返回true
时)。然后它将返回值