wasSharp – Diff between revs 39 and 45

Subversion Repositories:
Rev:
Only display areas with differencesIgnore whitespace
Rev 39 Rev 45
1 /////////////////////////////////////////////////////////////////////////// 1 ///////////////////////////////////////////////////////////////////////////
2 // Copyright (C) Wizardry and Steamworks 2013 - License: GNU GPLv3 // 2 // Copyright (C) Wizardry and Steamworks 2013 - License: GNU GPLv3 //
3 // Please see: http://www.gnu.org/licenses/gpl.html for legal details, // 3 // Please see: http://www.gnu.org/licenses/gpl.html for legal details, //
4 // rights of fair usage, the disclaimer and warranty conditions. // 4 // rights of fair usage, the disclaimer and warranty conditions. //
5 /////////////////////////////////////////////////////////////////////////// 5 ///////////////////////////////////////////////////////////////////////////
6   6  
7 using System; 7 using System;
8 using System.Collections.Generic; 8 using System.Collections.Generic;
9 using System.Linq; 9 using System.Linq;
-   10 using System.Threading;
10 using wasSharp.Collections.Specialized; 11 using wasSharp.Collections.Specialized;
11   12  
12 namespace wasSharp.Collections.Utilities 13 namespace wasSharp.Collections.Utilities
13 { 14 {
14 public static class CollectionExtensions 15 public static class CollectionExtensions
15 { 16 {
16 /// <summary> 17 /// <summary>
17 /// Compares two dictionaries for equality. 18 /// Compares two dictionaries for equality.
18 /// </summary> 19 /// </summary>
19 /// <typeparam name="TKey">key type</typeparam> 20 /// <typeparam name="TKey">key type</typeparam>
20 /// <typeparam name="TValue">value type</typeparam> 21 /// <typeparam name="TValue">value type</typeparam>
21 /// <param name="dictionary">dictionary to compare</param> 22 /// <param name="dictionary">dictionary to compare</param>
22 /// <param name="otherDictionary">dictionary to compare to</param> 23 /// <param name="otherDictionary">dictionary to compare to</param>
23 /// <returns>true if the dictionaries contain the same elements</returns> 24 /// <returns>true if the dictionaries contain the same elements</returns>
24 public static bool ContentEquals<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, 25 public static bool ContentEquals<TKey, TValue>(this IDictionary<TKey, TValue> dictionary,
25 IDictionary<TKey, TValue> otherDictionary) 26 IDictionary<TKey, TValue> otherDictionary)
26 { 27 {
27 return 28 return
28 (dictionary ?? new Dictionary<TKey, TValue>()).Count.Equals( 29 (dictionary ?? new Dictionary<TKey, TValue>()).Count.Equals(
29 (otherDictionary ?? new Dictionary<TKey, TValue>()).Count) && 30 (otherDictionary ?? new Dictionary<TKey, TValue>()).Count) &&
30 (otherDictionary ?? new Dictionary<TKey, TValue>()) 31 (otherDictionary ?? new Dictionary<TKey, TValue>())
31 .OrderBy(kvp => kvp.Key) 32 .OrderBy(kvp => kvp.Key)
32 .SequenceEqual((dictionary ?? new Dictionary<TKey, TValue>()) 33 .SequenceEqual((dictionary ?? new Dictionary<TKey, TValue>())
33 .OrderBy(kvp => kvp.Key)); 34 .OrderBy(kvp => kvp.Key));
34 } 35 }
35   -  
36 public static void UnionWith<TKey, TValue>(this IDictionary<TKey, TValue> target, -  
37 IDictionary<TKey, TValue> source) -  
38 { -  
39 var LockObject = new object(); -  
40 source.AsParallel().ForAll(o => -  
41 { -  
42 bool hasElement; -  
43 lock (LockObject) -  
44 { -  
45 hasElement = target.ContainsKey(o.Key); -  
46 } -  
47 switch (hasElement) -  
48 { -  
49 case true: -  
50 lock (LockObject) -  
51 { -  
52 target[o.Key] = o.Value; -  
53 } -  
54 break; -  
55   -  
56 default: -  
57 lock (LockObject) -  
58 { -  
59 target.Add(o.Key, o.Value); -  
60 } -  
61 break; -  
62 } -  
63 }); -  
64 } -  
65   36  
66 public static void AddOrReplace<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value) 37 public static void AddOrReplace<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, TValue value)
67 { 38 {
68 switch (dictionary.ContainsKey(key)) 39 switch (dictionary.ContainsKey(key))
69 { 40 {
70 case true: 41 case true:
71 dictionary[key] = value; 42 dictionary[key] = value;
72 break; 43 break;
73   44  
74 default: 45 default:
75 dictionary.Add(key, value); 46 dictionary.Add(key, value);
76 break; 47 break;
77 } 48 }
78 } 49 }
79   50  
80 public static void AddIfNotExists<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key, 51 public static void AddIfNotExists<TKey, TValue>(this IDictionary<TKey, TValue> dictionary, TKey key,
81 TValue value) 52 TValue value)
82 { 53 {
83 switch (!dictionary.ContainsKey(key)) 54 switch (!dictionary.ContainsKey(key))
84 { 55 {
85 case true: 56 case true:
86 dictionary.Add(key, value); 57 dictionary.Add(key, value);
87 break; 58 break;
88 } 59 }
89 } 60 }
90   61  
91 public static MultiKeyDictionary<K1, K2, V> ToMultiKeyDictionary<S, K1, K2, V>(this IEnumerable<S> items, 62 public static MultiKeyDictionary<K1, K2, V> ToMultiKeyDictionary<S, K1, K2, V>(this IEnumerable<S> items,
92 Func<S, K1> key1, Func<S, K2> key2, Func<S, V> value) 63 Func<S, K1> key1, Func<S, K2> key2, Func<S, V> value)
93 { 64 {
94 var dict = new MultiKeyDictionary<K1, K2, V>(); 65 var dict = new MultiKeyDictionary<K1, K2, V>();
95 foreach (var i in items) 66 foreach (var i in items)
96 { 67 {
97 dict.Add(key1(i), key2(i), value(i)); 68 dict.Add(key1(i), key2(i), value(i));
98 } 69 }
99 return dict; 70 return dict;
100 } 71 }
101 } 72 }
102 } 73 }
103   74