rec*_*ler 5 c# linq dictionary microsoft-metro
我不想使用foreach
循环两次,所以我尝试使用LINQ,但遗憾的是这不起作用:
return _etags.ToDictionary(item => item.Key, async item => await item.Value);
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我应该怎么做才能改进我的代码,或者我如何转换Dictionary<string, Task<string>>
为Dictionary<string, string>
?
这是我的代码:
private static async Task<Dictionary<string, string>> GetETagsAsync(List<string> feedsLink)
{
var eTags = new Dictionary<string, string>(feedsLink.Count);
System.Diagnostics.Stopwatch stopWatch = new System.Diagnostics.Stopwatch();
stopWatch.Start();
var _eTags = new Dictionary<string, Task<string>>(feedsLink.Count);
eTags = new Dictionary<string, string>(feedsLink.Count);
foreach (string feedLink in feedsLink)
{
if (Uri.IsWellFormedUriString(feedLink, UriKind.Absolute))
{
_eTags.Add(feedLink, GetETagAsync(feedLink));
}
else
{
throw new FormatException();
}
}
foreach (KeyValuePair<string, Task<string>> eTag in _eTags)
{
eTags.Add(eTag.Key, await eTag.Value);
}
stopWatch.Stop();
TimeSpan ts = stopWatch.Elapsed;
return eTags;
}
Run Code Online (Sandbox Code Playgroud)
小智 3
您不想在开始某些任务后抛出异常,最好先进行验证。
private static async Task<Dictionary<string, string>> GetETagsAsync(List<string> feedsLink)
{
ValidateFeedsLinkFormat(feedsLink);
var _eTags = feedsLink.ToDictionary(f => f, f => GetETagAsync(f));
await TaskEx.WhenAll(_eTags.Values);
var eTags = _eTags.ToDictionary(k => k.Key, k => k.Value.Result);
return eTags;
}
Run Code Online (Sandbox Code Playgroud)
此代码启动所有任务,就像您的代码一样,但对所有链接进行一次等待。您不想在多个线程上使用 Stopwatch 实例:来自MSDN:“不保证任何实例成员都是线程安全的。” 您可以使用Stopwatch.GetTimestamp();
两次并比较结果。