C# - использование LINQ для ввода двух переменных в 2-мерный массив?

У меня есть список класса "регион" с двумя переменными "startLocation" и "endLocation". Я хотел бы объединить эти два в новый сортированный 2-мерный массив, где его просто местоположение и целое число, представляющее его начало или конец.

например, если в списке есть три объекта региона с

[регион 1] : startLocation = 5, endLocation = 7

[регион 2] : startLocation = 3, endLocation = 5

[регион 3] : startLocation = 8, endLocation = 9

Я хотел бы получить отсортированный двумерный массив (или список или похожие) в виде:

[3] [1]

[5] [1]

[5] [-1]

[7] [-1]

[8] [1]

[9] [-1]

(желательно, чтобы перекрытия добавляли свои вторые значения вместе, чтобы два отдельных 5 в массиве быть объединены в [5 0]...но это не слишком важно)

в настоящее время я использую обычный forloop, проходящий через каждый по одному и добавляющий их в список по одному. Эта реализация довольно медленная, потому что я работаю с большими наборами данных, и я предполагаю, что есть более элегантный / быстрый способ выполнить это через LINQ.

любые предложения были бы очень признательны.

2 ответов


вам нужно будет определить вспомогательный метод, который разбивает область на 2 части, и гораздо проще представить это с помощью новой структуры против 2D-массива

struct Data {
  public int Value;
  public bool IsStart;
}

public static IEnumerable<Data> Split(this Region region) {
  yield return new Data() { Value = region.StartLocation, IsStart=true};
  yield return new Data() { Value = region.EndLocation, IsStart=false};
}

затем вы можете использовать следующий запрос LINQ, чтобы разбить их и отсортировать.

List<Region> list = GetTheList();
var query = list
  .SelectMany(x =>  x.Split())
  .OrderBy(x => x.Data);

это не решение, которое подходит для LINQ ни в чем, кроме интеллектуального упражнения. А foreach цикл будет таким же быстрым (на самом деле, скорее всего, быстрее), чем любая булыжная реализация LINQ.

в качестве примечания, я предполагаю, что вы используете foreach, а не for. Если нет, то вы можете значительно ускорить свой процесс, переключившись на foreach петли.

foreach(Region r in regionList)
{
    // add your entries using r
}

будет намного быстрее..

for(int i = 0; i < regionList.Count; i++)
{
    // add your entires using the indexer
}