Как перебирать несколько переменных? - PullRequest
0 голосов
/ 13 июля 2020

Я хотел бы создать короткую программу для загрузки нескольких изображений с веб-сайта.

В форме я хотел бы ввести root -ссылку на веб-сайт с заполнителями. Заполнители могут быть определены с помощью Start / End value и как c / des c.

Например: исходная ссылка -

google.de / 1236-01.jpg

, и я хотел бы создать все ссылки из

google.de / 1236-1.jpg

до

google.de / 9955-12.jpg

Итак, я ввел "google.de/[0] - [1] .jpg" , а заполнители установлены на:

[0] = start 1236|end 9955|asc
[1] = start 1|end 12|asc

Через GetValidCharacters() Я получаю строковый список допустимых комбинаций для каждого введенного заполнителя (можно выбрать по возрастанию / убыванию + начало и конец).

Цель, с которой я борюсь, - построить все комбинации этой ссылки, потому что мне нужно определить во время выполнения, сколько у меня заполнителей.

Моя идея заключалась в том, чтобы l oop по очереди и enquueue каждую новую строку сборки, пока не останется ни одной заполнители, но я не знаю, как это сделать.

Мне нужно убедиться, что введены все комбинации, и они вводятся только один раз.

private static void CreateDownloadList()
{
    Queue<string> tmpQueue = new Queue<string>(); //temp queue
    tmpQueue.Enqueue(DL_path); //DL_Path = google.de/[0]-[1].jpg
    string line = "";
    while ((line = tmpQueue.Dequeue()) != null) //not empty
    {
        if (line.Contains("[")) //placeholder
        {
            string tmpLine = line;
            //how to determine, which placeholder is next?? need to know this and replace this with every combination, I get from GetValidCharacters(start, end, DESC)
        }
        else //done
        {
            _urlList.Add(line);
        }
    }
}

Ответы [ 3 ]

1 голос
/ 13 июля 2020

как насчет простого for l oop?

for (int i = 1236; i <= 9955; i++)
{
    for (int j = 1; j <= 12; j++)
    {
        tmpQueue.Enqueue(string.Format("google.de/{0}-{1}.jpg", i, j)); 
    }
}
0 голосов
/ 14 июля 2020

@ Хоган, это был намек на правильный путь. решение это

private void CreateDownloadList()
        {
            Queue<string> tmpQueue = new Queue<string>();
            tmpQueue.Enqueue(downloadPathWithPlaceHolders);
            while(tmpQueue.Count > 0)
            {
                string currentItem = tmpQueue.Dequeue();
                bool test = false;
                if(currentItem.Contains("["))
                {
                    foreach(Placeholder p in _placeholders)
                    {
                        if(currentItem.Contains(p.PlaceHolder))
                        {
                            foreach(string s in p.Replacements)
                            {
                                tmpQueue.Enqueue(currentItem.Replace(p.PlaceHolder, s));
                            }
                            test = true;
                        }
                        if(test)
                            break;
                    }
                }
                else
                {
                    _downloadLinkList.Add(currentItem);
                }
            }
        }
0 голосов
/ 13 июля 2020

Я не собираюсь давать вам полный код, но вот некоторый псевдокод, который решит проблему.

указано:

todostack -- stack object that holds a list of unresolved items

replace_map -- map object that holds marker string and map of all values

marker_list -- list of all markers

final_list -- list object that holds the results

(обратите внимание, вы, вероятно, можете использовать marker_list и replace_map в одном объекте - у меня они разделены, чтобы код был понятнее)

init:

push todostack with your starting string

set marker_list and replace_map to correct values (from parameters I assume)

clear final_list

алгоритм:

 while (there are any items in todostack)
 {       
    curitem = todostack.pop
    if (curitem contains a marker in marker_list)
    {
       loop for each replacement in replace_map
       {
          new_item = curitem replaced with replacement
          todostack.push(new_item)
       }
    }
    else
      add curitem to final_list
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...