Выбор определенных элементов массива в C#

#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) строк элементов снизу. Это не одно и то же.