OSDN Git Service

C#7.0で追加された分解構文でKeyValuePairを分解する
authorKimura Youichi <kim.upsilon@bucyou.net>
Sat, 11 Mar 2017 17:35:55 +0000 (02:35 +0900)
committerKimura Youichi <kim.upsilon@bucyou.net>
Sat, 11 Mar 2017 18:45:24 +0000 (03:45 +0900)
拡張メソッド KeyValuePair<K,V>.Deconstruct を追加することでこの構文が使えるようになる

OpenTween/Api/TwitterApiStatus.cs
OpenTween/ApiInfoDialog.cs
OpenTween/Connection/OAuthUtility.cs
OpenTween/Connection/TwitterApiConnection.cs
OpenTween/Extensions.cs
OpenTween/HookGlobalHotkey.cs
OpenTween/ImageCache.cs
OpenTween/Models/HomeTabModel.cs
OpenTween/TabsDialog.cs

index 5ba3119..f135e06 100644 (file)
@@ -191,9 +191,9 @@ namespace OpenTween.Api
 
             public void AddAll(IDictionary<string, ApiLimit> resources)
             {
-                foreach (var res in resources)
+                foreach (var (key, value) in resources)
                 {
-                    this.innerDict[res.Key] = res.Value;
+                    this.innerDict[key] = value;
                 }
 
                 this.Owner.OnAccessLimitUpdated(new AccessLimitUpdatedEventArgs(null));
index dd54bc5..0ea4c18 100644 (file)
@@ -65,9 +65,9 @@ namespace OpenTween
             // その他
             group = this.ListViewApi.Groups[1];
             var apiStatuses = MyCommon.TwitterApiInfo.AccessLimit.Where(x => !_tlEndpoints.Contains(x.Key)).OrderBy(x => x.Key);
-            foreach (var pair in apiStatuses)
+            foreach (var (endpoint, apiLimit) in apiStatuses)
             {
-                AddListViewItem(pair.Key, pair.Value, group);
+                AddListViewItem(endpoint, apiLimit, group);
             }
 
             MyCommon.TwitterApiInfo.AccessLimitUpdated += this.TwitterApiStatus_AccessLimitUpdated;
index c65862c..d230311 100644 (file)
@@ -66,8 +66,8 @@ namespace OpenTween.Connection
             Dictionary<string, string> parameter = GetOAuthParameter(consumerKey, token);
             // OAuth共通情報にquery情報を追加
             if (query != null)
-                foreach (KeyValuePair<string, string> item in query)
-                    parameter.Add(item.Key, item.Value);
+                foreach (var (key, value) in query)
+                    parameter.Add(key, value);
             // 署名の作成・追加
             parameter.Add("oauth_signature", CreateSignature(consumerSecret, tokenSecret, httpMethod, requestUri, parameter));
             // HTTPリクエストのヘッダに追加
@@ -76,10 +76,10 @@ namespace OpenTween.Connection
             if (realm != null)
                 sb.AppendFormat("realm=\"{0}\",", realm);
 
-            foreach (KeyValuePair<string, string> item in parameter)
+            foreach (var (key, value) in parameter)
                 // 各種情報のうち、oauth_で始まる情報のみ、ヘッダに追加する。各情報はカンマ区切り、データはダブルクォーテーションで括る
-                if (item.Key.StartsWith("oauth_", StringComparison.Ordinal))
-                    sb.AppendFormat("{0}=\"{1}\",", item.Key, MyCommon.UrlEncode(item.Value));
+                if (key.StartsWith("oauth_", StringComparison.Ordinal))
+                    sb.AppendFormat("{0}=\"{1}\",", key, MyCommon.UrlEncode(value));
 
             return sb.ToString();
         }
index 254eb31..5432270 100644 (file)
@@ -213,13 +213,13 @@ namespace OpenTween.Connection
             {
                 if (param != null)
                 {
-                    foreach (var kv in param)
-                        postContent.Add(new StringContent(kv.Value), kv.Key);
+                    foreach (var (key, value) in param)
+                        postContent.Add(new StringContent(value), key);
                 }
                 if (media != null)
                 {
-                    foreach (var kv in media)
-                        postContent.Add(new StreamContent(kv.Value.OpenRead()), kv.Key, kv.Value.Name);
+                    foreach (var (key, value) in media)
+                        postContent.Add(new StreamContent(value.OpenRead()), key, value.Name);
                 }
 
                 request.Content = postContent;
index db95a7b..b712c83 100644 (file)
@@ -67,5 +67,11 @@ namespace OpenTween
 
             return false;
         }
+
+        public static void Deconstruct<TKey, TValue>(this KeyValuePair<TKey, TValue> kvp, out TKey key, out TValue value)
+        {
+            key = kvp.Key;
+            value = kvp.Value;
+        }
     }
 }
index 376934e..eaca710 100644 (file)
@@ -117,9 +117,9 @@ namespace OpenTween
             if ((modifiers & ModKeys.Shift) == ModKeys.Shift) modKey |= Keys.Shift;
             if ((modifiers & ModKeys.Win) == ModKeys.Win) modKey |= Keys.LWin;
             var key = new KeyEventArgs(hotkey | modKey);
-            foreach (var kvp in this._hotkeyID)
+            foreach (var (_, value) in this._hotkeyID)
             {
-                if (kvp.Value.KeyEvent.KeyData == key.KeyData && kvp.Value.Value == hotkeyValue) return true; // 登録済みなら正常終了
+                if (value.KeyEvent.KeyData == key.KeyData && value.Value == hotkeyValue) return true; // 登録済みなら正常終了
             }
             var hotkeyId = NativeMethods.RegisterGlobalHotKey(hotkeyValue, (int)modifiers, this._targetForm);
             if (hotkeyId > 0)
index 6f72f49..1f93b3a 100644 (file)
@@ -163,9 +163,8 @@ namespace OpenTween
 
                 lock (this.lockObject)
                 {
-                    foreach (var item in this.innerDictionary)
+                    foreach (var (_, task) in this.innerDictionary)
                     {
-                        var task = item.Value;
                         if (task.Status == TaskStatus.RanToCompletion)
                             task.Result?.Dispose();
                     }
index 8b5f6ea..8bfa474 100644 (file)
@@ -99,12 +99,12 @@ namespace OpenTween.Models
 
             var removeKeys = new List<DateTime>();
             var tweetsInWindow = 0;
-            foreach (var pair in this.tweetsTimestamps)
+            foreach (var (timestamp, count) in this.tweetsTimestamps)
             {
-                if (now - pair.Key > oneHour)
-                    removeKeys.Add(pair.Key);
+                if (now - timestamp > oneHour)
+                    removeKeys.Add(timestamp);
                 else
-                    tweetsInWindow += pair.Value;
+                    tweetsInWindow += count;
             }
             Interlocked.Exchange(ref this.tweetsPerHour, tweetsInWindow);
 
index 9ba8cba..57e9f23 100644 (file)
@@ -80,14 +80,14 @@ namespace OpenTween
                 });
             }
 
-            foreach (var tab in this.TabInfo.Tabs)
+            foreach (var (name, tab) in this.TabInfo.Tabs)
             {
-                if (!tab.Value.IsDistributableTabType) continue;
+                if (!tab.IsDistributableTabType) continue;
 
                 this.TabList.Items.Add(new TabListItem
                 {
-                    Label = tab.Key,
-                    Tab = tab.Value,
+                    Label = name,
+                    Tab = tab,
                 });
             }
         }