Merge pull request #829 from symform/httpwebreq-async-ssl
[mono.git] / mcs / class / System.Core / System.Linq / Enumerable.cs
index 71f392690a47666dc15496f0ffbcca58fe56dae7..23805636c6b6236d00dc7b20fce0feeb83ffd659 100644 (file)
@@ -744,6 +744,12 @@ namespace System.Linq
                        if (list != null)
                                return list [index];
 
+#if NET_4_5
+                       var readOnlyList = source as IReadOnlyList<TSource>;
+                       if (readOnlyList != null)
+                               return readOnlyList[index];
+#endif
+
                        return source.ElementAt (index, Fallback.Throw);
                }
 
@@ -762,6 +768,12 @@ namespace System.Linq
                        if (list != null)
                                return index < list.Count ? list [index] : default (TSource);
 
+#if NET_4_5
+                       var readOnlyList = source as IReadOnlyList<TSource>;
+                       if (readOnlyList != null)
+                               return index < readOnlyList.Count ? readOnlyList [index] : default (TSource);
+#endif
+
                        return source.ElementAt (index, Fallback.Default);
                }
 
@@ -1099,7 +1111,7 @@ namespace System.Linq
 
                        foreach (TOuter element in outer) {
                                TKey outerKey = outerKeySelector (element);
-                               if (innerKeys.Contains (outerKey))
+                               if (outerKey != null && innerKeys.Contains (outerKey))
                                        yield return resultSelector (element, innerKeys [outerKey]);
                                else
                                        yield return resultSelector (element, Empty<TInner> ());
@@ -1166,7 +1178,7 @@ namespace System.Linq
 
                        foreach (TOuter element in outer) {
                                TKey outerKey = outerKeySelector (element);
-                               if (innerKeys.Contains (outerKey)) {
+                               if (outerKey != null && innerKeys.Contains (outerKey)) {
                                        foreach (TInner innerElement in innerKeys [outerKey])
                                                yield return resultSelector (element, innerElement);
                                }