#c# #arrays #select #elements
#c# #массивы #выберите #элемент
Вопрос:
У меня возникают некоторые трудности с выбором определенных элементов массива в C #.
Представьте данные ниже:
-3,-3
-2,-2
-1,-1
0,0
1,1
2,2
3,3
Они являются точками прямой в декартовом формате. Теперь я сохраняю их в массиве, подобном этому
int[,] linePoints
Теперь я хочу создать другой массив, который не содержит первых N элементов и последних M элементов массива linePoints. Как это можно сделать?
Итак, если N равно 2, а M равно 2, результирующий массив должен быть:
-1,-1
0,0
1,1
(Я не хочу иметь дело с PointF на этом шаге, позже сокращенный массив я могу преобразовать в PointF[])
Спасибо.
Комментарии:
1. Определите «первый» и «последний», когда у вас есть 2D-массив.
Ответ №1:
Прежде всего, я не думаю, что вам следует отказаться от рассмотрения PointF на этом этапе, но позвольте мне показать вам, почему.
Если у вас есть этот массив:
int[,] linePoints;
И вы хотите удалить «самые верхние» N элементов и «самые нижние» M элементов, вам нужно будет проделать некоторую работу.
Позвольте мне показать вам код:
void Main()
{
int[,] linePoints =
{
{ -3, -3 },
{ -2, -2 },
{ -1, -1 },
{ 0, 0 },
{ 1, 1 },
{ 2, 2 },
{ 3, 3 },
};
int N = 2;
int M = 2;
// start of the code you're asking for
int width = linePoints.GetLength(1);
int newHeight = linePoints.GetLength(0) - (N M);
int[,] newLinePoints = new int[newHeight, width];
for (int y = 0; y < newHeight; y )
for (int x = 0; x < width; x )
newLinePoints[y, x] = linePoints[N y, x];
// end of the code you're asking for
linePoints.Dump();
newLinePoints.Dump();
}
Теперь давайте посмотрим, как бы выглядел приведенный выше код, если бы вы использовали PointF вместо этого.
void Main()
{
PointF[] linePoints =
{
new PointF(-3, -3),
new PointF(-2, -2),
new PointF(-1, -1),
new PointF(0, 0),
new PointF(1, 1),
new PointF(2, 2),
new PointF(3, 3),
};
int N = 2;
int M = 2;
// start of the code you're asking for
PointF[] newLinePoints = linePoints
.Skip(N)
.Take(linePoints.Length - (N M))
.ToArray();
// end of the code you're asking for
linePoints.Dump();
newLinePoints.Dump();
}
(примечание: .Dump()
части там происходят из того факта, что я использую LINQPad для тестирования своего кода.)
Ответ №2:
Вы ищете:
for(int i = n; i<lineOfPoints.Length - m ;i ) line[i]
и вы должны объявить свою строку примерно так:
Piont[] lineOfPoints;
Редактировать:
@Rob amp; Aviad Спасибо, что указали на это (lineOfPoints.Длина — m)
Комментарии:
1. Условие терминала должно быть
line.Length - m
2. но он сказал, что не хочет выполнять итерацию до последнего элемента, ему нужны точки из интервала m, n
3. если n = 2 и m = 2 (в его примере), этот цикл ничего не напечатает
4. Это то, что он говорит? Он говорит, что ему не нужны первые N элементов, не то чтобы ему не нужны первые элементы за пределами N ..M.
5. @Rob 10x думаю, я выпил недостаточно кофе на сегодня
Ответ №3:
Во-первых: используйте вместо точек точку или пользовательскую структуру. Затем вы можете использовать :
List<Point> points = // your points here
points = points.Skip(n).Take(points.Count-m-n).ToList();
Но если вы все еще хотите использовать array, что я настоятельно не рекомендую в основном из-за подобных проблем, тогда вы можете использовать подобный код (не тестировался) :
//int[,] linePoints
int[,] newLinePoints = new int[linePoints.Length-m-n,2] // not sure about order here
for(i = n; i < linePoints.Length - m; i )
{
newLinePoints[i-n,0] = linePoints[i,0];
newLinePoints[i-n,1] = linePoints[i,1];
}
Ответ №4:
или, ИМХО, немного более элегантный
List<Point> points = new List<Point>()
//add points
List<Point> foundPoints = points.GetRange(n, points.Count - n - m)
Ответ №5:
int[,] linePoints= new int[,]{ {-3,-3} ,{-2,-2}, {-1,-1}, {0,0}, {1,1}, {2,2}, {3,3} };
int n=2;
int m=2;
for(int i=n;i<linePoints.GetLength(0)-m;i )
Console.WriteLine(linePoints[i,0] "," linePoints[i,0]);
Ответ №6:
Как я понял, вы хотите получить из массива элементы, пропустить первые n и последние m элементов и сохранить их в другом массиве, вам следует использовать этот код
int [,] newpoints = new int[n1,2];
int j = 0;
for (int i = n; i < N - m; i )
{
newpoints[j, 0] = linePoints[i, 0];
newpoints[j, 1] = linePoints[i, 1];
j;
}
где n1 равно номеру строки старого массива минус n
N — номер строки в линейных точках
for (int i = 0; i < n1; i )
{
Console.WriteLine("{0},{1}",newpoints[i,0],newpoints[i,1]);
}
Ответ №7:
Вы могли бы попробовать это.
Точки списка = новый список(); //Заполните свой список точек здесь точками.Добавить(новую точку(2,2)); и т.д. Точка p = новая точка (2,2); если (указывает.Содержит(p)) { точки.Удалить(p); } // Это даст вам новый список, в котором выполняется условие предиката, где точка X не равна 2, а точка Y не равна 2 var newList = точки.Где(p => p.X != 2 amp; p.Y != 2); //Примечание. если вы используете вышеуказанное, вам не нужно удалять точку (2,2) из списка точек
Комментарии:
1. Это показывает ему, как легко работать с массивами. Необходимость перебирать массив и удалять его или добавлять в другой массив — это просто дополнительный код, где приведенное выше дает ему простое решение для удаления точки из массива, а также дает ему отправную точку для работы.
2. Но он не просит удалить точку с координатами 2,2, он спрашивает, как избавиться от 2 (N) строк элементов сверху и 2 (M) строк элементов снизу. Это не одно и то же.