diff options
Diffstat (limited to 'MediaBrowser.Model/Extensions')
| -rw-r--r-- | MediaBrowser.Model/Extensions/LinqExtensions.cs | 97 | ||||
| -rw-r--r-- | MediaBrowser.Model/Extensions/ListHelper.cs | 24 | ||||
| -rw-r--r-- | MediaBrowser.Model/Extensions/StringHelper.cs | 57 |
3 files changed, 178 insertions, 0 deletions
diff --git a/MediaBrowser.Model/Extensions/LinqExtensions.cs b/MediaBrowser.Model/Extensions/LinqExtensions.cs new file mode 100644 index 000000000..09ace42e8 --- /dev/null +++ b/MediaBrowser.Model/Extensions/LinqExtensions.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; + +namespace MediaBrowser.Model.Extensions +{ + // MoreLINQ - Extensions to LINQ to Objects + // Copyright (c) 2008 Jonathan Skeet. All rights reserved. + // + // Licensed under the Apache License, Version 2.0 (the "License"); + // you may not use this file except in compliance with the License. + // You may obtain a copy of the License at + // + // http://www.apache.org/licenses/LICENSE-2.0 + // + // Unless required by applicable law or agreed to in writing, software + // distributed under the License is distributed on an "AS IS" BASIS, + // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + // See the License for the specific language governing permissions and + // limitations under the License. + + public static class LinqExtensions + { + /// <summary> + /// Returns all distinct elements of the given source, where "distinctness" + /// is determined via a projection and the default equality comparer for the projected type. + /// </summary> + /// <remarks> + /// This operator uses deferred execution and streams the results, although + /// a set of already-seen keys is retained. If a key is seen multiple times, + /// only the first element with that key is returned. + /// </remarks> + /// <typeparam name="TSource">Type of the source sequence</typeparam> + /// <typeparam name="TKey">Type of the projected element</typeparam> + /// <param name="source">Source sequence</param> + /// <param name="keySelector">Projection for determining "distinctness"</param> + /// <returns>A sequence consisting of distinct elements from the source sequence, + /// comparing them by the specified key projection.</returns> + + public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, + Func<TSource, TKey> keySelector) + { + return source.DistinctBy(keySelector, null); + } + + public static TSource[] ToArray<TSource>(this IEnumerable<TSource> source, int count) + { + if (source == null) throw new ArgumentNullException("source"); + if (count < 0) throw new ArgumentOutOfRangeException("count"); + var array = new TSource[count]; + int i = 0; + foreach (var item in source) + { + array[i++] = item; + } + return array; + } + + /// <summary> + /// Returns all distinct elements of the given source, where "distinctness" + /// is determined via a projection and the specified comparer for the projected type. + /// </summary> + /// <remarks> + /// This operator uses deferred execution and streams the results, although + /// a set of already-seen keys is retained. If a key is seen multiple times, + /// only the first element with that key is returned. + /// </remarks> + /// <typeparam name="TSource">Type of the source sequence</typeparam> + /// <typeparam name="TKey">Type of the projected element</typeparam> + /// <param name="source">Source sequence</param> + /// <param name="keySelector">Projection for determining "distinctness"</param> + /// <param name="comparer">The equality comparer to use to determine whether or not keys are equal. + /// If null, the default equality comparer for <c>TSource</c> is used.</param> + /// <returns>A sequence consisting of distinct elements from the source sequence, + /// comparing them by the specified key projection.</returns> + + public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, + Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer) + { + if (source == null) throw new ArgumentNullException("source"); + if (keySelector == null) throw new ArgumentNullException("keySelector"); + return DistinctByImpl(source, keySelector, comparer); + } + + private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source, + Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer) + { + var knownKeys = new HashSet<TKey>(comparer); + foreach (var element in source) + { + if (knownKeys.Add(keySelector(element))) + { + yield return element; + } + } + } + } +} diff --git a/MediaBrowser.Model/Extensions/ListHelper.cs b/MediaBrowser.Model/Extensions/ListHelper.cs new file mode 100644 index 000000000..243ae3105 --- /dev/null +++ b/MediaBrowser.Model/Extensions/ListHelper.cs @@ -0,0 +1,24 @@ +using System; + +namespace MediaBrowser.Model.Extensions +{ + public static class ListHelper + { + public static bool ContainsIgnoreCase(string[] list, string value) + { + if (value == null) + { + throw new ArgumentNullException("value"); + } + + foreach (var item in list) + { + if (string.Equals(item, value, StringComparison.OrdinalIgnoreCase)) + { + return true; + } + } + return false; + } + } +} diff --git a/MediaBrowser.Model/Extensions/StringHelper.cs b/MediaBrowser.Model/Extensions/StringHelper.cs new file mode 100644 index 000000000..fa79d09db --- /dev/null +++ b/MediaBrowser.Model/Extensions/StringHelper.cs @@ -0,0 +1,57 @@ +using System; +using System.Text; + +namespace MediaBrowser.Model.Extensions +{ + /// <summary> + /// Isolating these helpers allow this entire project to be easily converted to Java + /// </summary> + public static class StringHelper + { + /// <summary> + /// Equalses the ignore case. + /// </summary> + /// <param name="str1">The STR1.</param> + /// <param name="str2">The STR2.</param> + /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns> + public static bool EqualsIgnoreCase(string str1, string str2) + { + return string.Equals(str1, str2, StringComparison.OrdinalIgnoreCase); + } + + /// <summary> + /// Replaces the specified STR. + /// </summary> + /// <param name="str">The STR.</param> + /// <param name="oldValue">The old value.</param> + /// <param name="newValue">The new value.</param> + /// <param name="comparison">The comparison.</param> + /// <returns>System.String.</returns> + public static string Replace(this string str, string oldValue, string newValue, StringComparison comparison) + { + var sb = new StringBuilder(); + + var previousIndex = 0; + var index = str.IndexOf(oldValue, comparison); + + while (index != -1) + { + sb.Append(str.Substring(previousIndex, index - previousIndex)); + sb.Append(newValue); + index += oldValue.Length; + + previousIndex = index; + index = str.IndexOf(oldValue, index, comparison); + } + + sb.Append(str.Substring(previousIndex)); + + return sb.ToString(); + } + + public static string FirstToUpper(this string str) + { + return string.IsNullOrEmpty(str) ? "" : str.Substring(0, 1).ToUpper() + str.Substring(1); + } + } +} |
