using System; using System.Collections.Generic; using System.Linq; namespace IRCTokens { public static class EnumerableExtensions { public static IEnumerable Split(this byte[] bytes, byte separator) { if (bytes == null || bytes.Length == 0) return new List(); var newLineIndices = bytes.Select((b, i) => b == separator ? i : -1).Where(i => i != -1).ToArray(); var lines = new byte[newLineIndices.Length + 1][]; var currentIndex = 0; var arrIndex = 0; for (var i = 0; i < newLineIndices.Length && currentIndex < bytes.Length; ++i) { var n = new byte[newLineIndices[i] - currentIndex]; Array.Copy(bytes, currentIndex, n, 0, newLineIndices[i] - currentIndex); currentIndex = newLineIndices[i] + 1; lines[arrIndex++] = n; } // Handle the last string at the end of the array if there is one. if (currentIndex < bytes.Length) lines[arrIndex] = bytes.Skip(currentIndex).ToArray(); else if (arrIndex == newLineIndices.Length) // We had a separator character at the end of a string. Rather than just allowing // a null character, we'll replace the last element in the array with an empty string. lines[arrIndex] = Array.Empty(); return lines.ToArray(); } public static byte[] Trim(this IEnumerable bytes, byte separator) { if (bytes == null) return Array.Empty(); var byteList = new List(bytes); var i = 0; if (!byteList.Any()) return byteList.ToArray(); while (byteList[i] == separator) { byteList.RemoveAt(i); i++; } i = byteList.Count - 1; while (byteList[i] == separator) { byteList.RemoveAt(i); i--; } return byteList.ToArray(); } } }