4 using System.Collections;
5 using System.Collections.Generic;
7 using System.Reflection;
9 namespace SiliconStudio.Core.Extensions
21 throw new ArgumentNullException(
"source");
24 if (collection != null)
25 return collection.IsReadOnly;
27 var list = source as IList;
29 return list.IsReadOnly;
42 while (enumerator.MoveNext())
43 yield
return enumerator.Current;
54 while (enumerator.MoveNext())
55 yield
return (T)enumerator.Current;
60 if (enumerable1 == null)
throw new ArgumentNullException(
"enumerable1");
61 if (enumerable2 == null)
throw new ArgumentNullException(
"enumerable2");
63 using (IEnumerator<T1> enumerator1 = enumerable1.GetEnumerator())
65 using (IEnumerator<T2> enumerator2 = enumerable2.GetEnumerator())
67 bool enumMoved =
true;
70 enumMoved = enumerator1.MoveNext();
71 bool enum2Moved = enumerator2.MoveNext();
72 if (enumMoved != enum2Moved)
73 throw new InvalidOperationException(
"Enumerables do not have the same number of items.");
77 yield
return Tuple.Create(enumerator1.Current, enumerator2.Current);
93 foreach (T item
in source)
97 foreach (T child
in childrenSelector(item).SelectDeep(childrenSelector))
104 return source.Distinct(
new SelectorEqualityComparer<T, TKey>(selector));
109 if (ReferenceEquals(a1, a2))
112 if (a1 == null || a2 == null)
115 if (comparer == null)
118 var e1 = a1.GetEnumerator();
119 var e2 = a2.GetEnumerator();
123 bool move1 = e1.MoveNext();
124 bool move2 = e2.MoveNext();
127 if (!move1 && !move2)
134 if (!comparer.Equals(e1.Current, e2.Current))
143 if (ReferenceEquals(a1, a2))
146 if (a1 == null || a2 == null)
149 var e1 = a1.GetEnumerator();
150 var e2 = a2.GetEnumerator();
154 bool move1 = e1.MoveNext();
155 bool move2 = e2.MoveNext();
158 if (!move1 && !move2)
166 if (e1.Current != null && !e1.Current.Equals(e2.Current))
170 if (e2.Current != null && !e2.Current.Equals(e1.Current))
178 object firstNotNull = values.FirstOrDefault(x => x != null);
180 if (firstNotNull == null)
183 value = firstNotNull;
185 return values.SkipWhile(x => x != firstNotNull).All(firstNotNull.Equals);
197 if (!dictionary.TryGetValue(key, out value))
199 value =
new TValue();
200 dictionary.Add(key, value);
205 public static int RemoveWhere<T>(
this IList<T> list, Predicate<T> predicate)
208 var array = list.ToArray();
209 for (var i = array.Length - 1; i >= 0; --i)
211 if (predicate(array[i]))
219 public static int RemoveWhere<T>(
this ICollection<T> collection, Predicate<T> predicate)
222 foreach (var item
in collection.ToArray().Where(x => predicate(x)))
224 collection.Remove(item);
230 class SelectorEqualityComparer<T, TKey> : IEqualityComparer<T>
232 Func<T, TKey> selector;
234 public SelectorEqualityComparer(Func<T, TKey> selector)
236 this.selector = selector;
239 public bool Equals(T x, T
y)
241 var keyX = selector(x);
242 var keyY = selector(y);
243 if (!typeof(T).GetTypeInfo().IsValueType)
245 if (
object.ReferenceEquals(keyX, null))
246 return object.ReferenceEquals(keyY, null);
249 return selector(x).Equals(selector(y));
252 public int GetHashCode(T obj)
254 var key = selector(obj);
255 if (!typeof(T).GetTypeInfo().IsValueType &&
object.ReferenceEquals(key, null))
257 return key.GetHashCode();
_In_ size_t _In_ DXGI_FORMAT _In_ size_t _In_ float size_t y
static bool SequenceEqual(this IEnumerable a1, IEnumerable a2)
static bool AllEqual(this IEnumerable< object > values, out object value)
static bool IsReadOnly(this IEnumerable source)
Checks whether the IEnumerable represents a readonly data source.