sources/Google.Solutions.Common/Linq/EnumerableExtensions.cs (56 lines of code) (raw):

// // Copyright 2019 Google LLC // // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you 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. // using Google.Solutions.Common.Util; using System.Collections.Generic; using System.Linq; namespace Google.Solutions.Common.Linq { /// <summary> /// Utility methods for working with Enumerables. /// </summary> public static class EnumerableExtensions { /// <summary> /// Create a hashset from an enumerable. /// </summary> public static HashSet<T> ToHashSet<T>( this IEnumerable<T> source, IEqualityComparer<T>? comparer = null) { return new HashSet<T>(source, comparer); } /// <summary> /// Ensure that an enumerable is not null. /// </summary> /// <returns> /// The enumerable or an empty enumerable if it's null /// </returns> public static IEnumerable<T> EnsureNotNull<T>( this IEnumerable<T>? e) { return e ?? Enumerable.Empty<T>(); } /// <summary> /// Check if the enumerable is a subset of another /// enumerable. /// </summary> public static bool ContainsAll<T>( this IEnumerable<T> sequence, IEnumerable<T> lookup) { return !lookup.Except(sequence).Any(); } /// <summary> /// Split an enumerable into multiple enumerables that /// each have a maximum size. /// </summary> public static IEnumerable<IEnumerable<T>> Chunk<T>( this IEnumerable<T> source, ushort chunkSize) { source.ExpectNotNull(nameof(source)); var chunk = new List<T>(chunkSize); foreach (var x in source) { chunk.Add(x); if (chunk.Count == chunkSize) { yield return chunk; chunk = new List<T>(chunkSize); } } if (chunk.Count != 0) { yield return chunk; } } /// <summary> /// Concatenate an enumerable with a single item. /// </summary> public static IEnumerable<T> ConcatItem<T>(this IEnumerable<T> target, T item) { target.ExpectNotNull(nameof(target)); foreach (var t in target) { yield return t; } yield return item; } } }