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
}