Используйте LINQ для группировки последовательности чисел без пробелов

С помощью этого массива int[]{ 1, 2, 3, 4, 7, 8, 11, 15,16,17,18 }; Как я могу преобразовать в этот строковый массив "1-4","7-8","11","15-18"

Предложения? Linq?

 var array = new int[] { 1, 2, 3, 4, 7, 8, 11, 15, 16, 17, 18 }; var result = string.Join(",", array .Distinct() .OrderBy(x => x) .GroupAdjacentBy((x, y) => x + 1 == y) .Select(g => new int[] { g.First(), g.Last() }.Distinct()) .Select(g => string.Join("-", g))); 

с

 public static class LinqExtensions { public static IEnumerable> GroupAdjacentBy( this IEnumerable source, Func predicate) { using (var e = source.GetEnumerator()) { if (e.MoveNext()) { var list = new List { e.Current }; var pred = e.Current; while (e.MoveNext()) { if (predicate(pred, e.Current)) { list.Add(e.Current); } else { yield return list; list = new List { e.Current }; } pred = e.Current; } yield return list; } } } } 

Вам не нужен Linq; на самом деле, самое простое решение требует знания трех позиций в массиве (ваш начальный номер, текущий номер и следующий номер после текущего), для которых enums не подходят.

Попробуй это:

 var start = 0; var end = 0; var write = false; var builder = new StringBuilder(); for(var i=0; i array[i] + 1) { end = i; write = true; } if(write) { if(end - start == 0) //one number builder.Append(String.Format("{0}, ", array[start]); else //multi-number range builder.Append(String.Format("{0}-{1}, ", array[start], array[end]); start = i+1; end = i+1; //not really necessary but avoids any possible case of counting backwards write = false; } } 

Вы можете изменить это, чтобы уменьшить вложенность кода, continue раннюю логику цикла и удалить несколько vars; вы получите несколько миллисекунд времени выполнения. Вам также нужно обрезать последние два символа (конечную запятую и пробел) с конца StringBuilder, прежде чем вывести String.

Какой алгоритм вы хотите реализовать? Выясните, что вы хотите сделать, а затем посмотрите, может ли он быть более ясным с переводом LINQ. Вот что-то не-LINQ, которое может дать вам идею.

 int[] array = { 1, 2, 3, 4, 7, 8, 11, 15, 16, 17, 18}; List ranges = new List(); // code assumes array is not zero-length, is distinct, and is sorted. // to do: handle scenario as appropriate if assumptions not valid Action> addToRanges = (first, last, list) => { if (last == first) list.Add(last.ToString()); else list.Add(string.Format("{0}-{1}", first, last)); ; }; int firstItem = array[0]; int lastItem = firstItem; foreach (int item in array.Skip(1)) { if (item > lastItem + 1) { addToRanges(firstItem, lastItem, ranges); firstItem = lastItem = item; } else { lastItem = item; } } addToRanges(firstItem, lastItem, ranges); // return ranges or ranges.ToArray() 

Вот он:

 public static IEnumerable ToRanges(this IEnumerable values) { int? start = null, end = null; foreach (var value in values.OrderBy(vv => vv)) { if (!start.HasValue) { start = value; } else if (value == (end ?? start) + 1) { end = value; } else { yield return end.HasValue ? String.Format("{0}-{1}", start, end) : String.Format("{0}", start); start = value; end = null; } } if (start.HasValue) { yield return end.HasValue ? String.Format("{0}-{1}", start, end) : String.Format("{0}", start); } } 
  • Как просмотреть LINQ Сгенерированные операторы SQL?
  • Почему не поддерживаются методы расширения classа C #?
  • ToList () - Создает ли он новый список?
  • List.Except не работает
  • В чем разница между IQueryable и IEnumerable ?
  • Заполнение DataSet или DataTable из набора результатов запроса LINQ
  • LINQ объединяет две таблицы данных
  • Выражение рекурсии в LINQ
  • Linq упорядочивает, группирует и упорядочивает по каждой группе?
  • Удалить дубликаты в списке, используя linq
  • Entity Framework Include OrderBy random генерирует повторяющиеся данные
  • Interesting Posts

    Весовые данные JPA-запрос с параметрическими свойствами

    Пользовательская обработка SSL перестала работать на Android 2.2 FroYo

    Явный экземпляр – когда он используется?

    Любая причина использования автоматически реализованных свойств по сравнению с ручными реализованными свойствами?

    Ошибка: протокол недоступен, сброс backtrace

    Существует ли компилятор R?

    Зачем нужен Windows XP в Windows 7?

    USB-проблема – 2.0 накопитель часто подключается как 1.0

    Использование API Карт Google для получения данных о времени поездки

    Ruby on Rails 3 Не удается подключиться к локальному серверу MySQL через сокет «/tmp/mysql.sock» в OSX

    Правильный спецификатор формата для печати указателя (адреса)?

    Разбор строк в Java с вкладкой «\ t» разделителя с использованием split

    Как создать декартово произведение списка типов?

    Добавление изображения в Toast?

    Векторизованные шрифты в формате PDF для монтажа ImageMagick?

    Давайте будем гением компьютера.