2013-07-28 221 views
4

我不想使用foreach循環兩次,所以我試圖使用LINQ,但不幸的是,這並不工作:轉換詞典<字符串,任務<string>>到詞典<字符串,字符串>

return _etags.ToDictionary(item => item.Key, async item => await item.Value); 

誰能告訴我該怎麼做才能改善我的代碼,或者我該如何將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; 
    } 
+0

您是否試過'.ToDictionary(item => item.Key,item => item.Value.Result);'? – I4V

回答

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; 
    } 

該代碼將像您一樣啓動所有任務,但只有一個等待所有鏈接。 您不希望在多個線程上使用Stopwatch實例:MSDN:「任何實例成員不保證是線程安全的。」 您可以使用兩次Stopwatch.GetTimestamp();並比較結果。

+0

非常感謝您的幫助,現在我的代碼如下所示: http://pastebin.com/6Qnyn4j1 我還有一個問題。正如你所看到的,我使用方法GetETagAsync,在這種方法看起來像這樣: http://pastebin.com/p2TzC48x 我也驗證了鏈接。我應該驗證以前的方法(GetETagsAsync)中的鏈接嗎? GetETagAsync是否正確寫入? –

+0

我不認爲有必要驗證GetETagAsync中的鏈接,因爲它是私人的,只能從您的代碼中調用它。如果你想全部或全部沒有,批量驗證你的數據會更好,但是如果你想加載可以加載的內容,請在GetETagAsync中驗證並使用try/catch塊。 –

+0

拋出異常不是一個好習慣,也許可以使用返回類,或者至少指定所有問題,而不是空的異常 –

相關問題