Множественная замена foreach - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть функция, которая записывает текст в графический блок, используя строку, полученную из списка, и координаты X и Y точки из списка.

Я пытаюсь напечатать первую строку по первой координате X и Y, вторую строку по второй координате x и y и так далее.Но я не могу понять, как это сделать.Я попробовал это, используя приведенный ниже код, но он рисует всю строку в каждой координате.

   Graphics g = pictureBox1.CreateGraphics();

   foreach (var str in outputstring)
    {
      foreach (var xpoint in cofgravX)
       {
        fx = (int)xpoint;

        foreach (var ypoint in cofgravY)
         {
           fy = (int)ypoint;

            listBox2.Items.Add(str);
            string drawString = str.ToString();
            Font drawFont = new Font("Arial", 16);
            SolidBrush drawBrush = new SolidBrush(Color.White);
            PointF drawPoint = new PointF(fx, fy);
            g.DrawString(drawString, drawFont, drawBrush, drawPoint);

          }
        }

     }

1 Ответ

0 голосов
/ 25 февраля 2019

Вам не нужно вкладывать свои петли.Вместо этого вам нужно выполнить цикл один раз, а затем извлечь из каждой коллекции нужный объект.Это можно сделать с помощью цикла for и оператора индекса или с помощью .Zip() для стиля LINQish.

var outputstring = new List<string> { "Hello", "World" };
var cofgravX = new List<int> { 5, 20 };
var cofgravY = new List<int> { 5, 20 };

// As for loop
for (int i = 0; i < outputstring.Count; i++)
{
    var message = outputstring[i];
    var fx = cofgravX[i]; // This could throw an ArgumentOutOfRangeException
    var fy = cofgravY[i]; // This could throw an ArgumentOutOfRangeException

    // ToDo: Draw on graphics object
}


// LINQish way
var items = cofgravX
    .Zip(cofgravY, (X, Y) => new { X, Y })
    .Zip(outputstring, (Position, Message) => new { Position, Message });

// This will iterate as long as the shortest sequence of all three collection.
foreach (var item in items)
{
    var message = item.Message;
    var fx = item.Position.X;
    var fy = item.Position.Y;

    // ToDo: Draw on graphics object
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...