C #: рекурсивный поиск в двух разных структурах данных - PullRequest
0 голосов
/ 26 октября 2011

Мне нужно выполнить поиск в двух разных структурах данных в C #, и вот в чем дело: у меня есть одно имя (которое является строкой), и я хочу выполнить поиск.У меня есть функция с именем Exists, которая будет возвращать bool, указывающий, существует ли она или нет.

В случае, если она существует, я увеличиваю имя (просто добавляя 1 в конце строки),а затем мне нужно снова выполнить поиск (с помощью метода exists), чтобы увидеть, существует ли объект с новым именем.

Это будет продолжаться до тех пор, пока не появится неиспользуемое имя, которое я мог бы использовать, НО, если оно не существует, теперь я должен выполнить поиск другой структуры данных, которая содержит объекты, которые были удалены, и еслитам найдена строка, тогда мне придется снова увеличить имя и начать поиск с самого начала.Все это закончилось бы, если бы не было объекта с таким именем ни с использованием метода Exists, ни в структуре данных, где находятся все удаленные объекты.

Как я мог бы подойти к этой проблеме?

Iнадеюсь, я четко выразил свое мнение: -)

Заранее большое спасибо!

Ответы [ 5 ]

2 голосов
/ 26 октября 2011
string BuildNextName(string originalName)
{
  string name = originalName;
  while( Exists(name) || deletedNames.Contains(name))
  {
    name = Increment(name);
  }

  return name;
}

Или я что-то пропустил?

Использование цикла for:

string BuildNextName(string originalName)
{
  for (string name=originalName; 
       Exists(name) || deletedNames.Contains(name);
       name = Increment(name));

  return name;
}

Кстати, я полагаю, что ваш алгоритм приращения имени сложнее, чем просто добавление 1: name, name1, name2, ... Обычно, если имя не заканчивается цифрой, вы добавляете «1». Если это так, вы увеличиваете это число. право?

0 голосов
/ 26 октября 2011

если вы создаете Exists методы для обеих структур данных, вы можете выполнять поиск с помощью рекурсии следующим образом: псевдокод:

string resultName;
void Search(string name)
{
  if(ExistsInFirstStructure(name)) //name is in first data structure
    Search(name + "1"); //add 1 and try again
  else
    if(ExistsInSecondStructure(name)) //name exists in second data structure
      Search(name + "1"); //perform search again
    else
      resultName = name; //current name wasn't found in first and second data structures - we have result
}
0 голосов
/ 26 октября 2011

Как насчет этого:

var listOfExistingNames = new List<string> { "MyName", "MyName1", "MyName3" };
var listOfDeletedNames = new List<string> { "MyName2", "MyName5" };

int counter = 0;
string baseToFindFreePlace = "MyName";
string newName = baseToFindFreePlace;

var allNames = listOfExistingNames.Concat(listOfDeletedNames);

while (allNames.Contains(newName))
{
    counter++;
    newName = baseToFindFreePlace + counter;
}

listOfExistingNames.Add(newName);
0 голосов
/ 26 октября 2011

нерекурсивное и простое решение может быть примерно таким (я не вижу необходимости в рекурсии в этом случае)

   //pseudocode

    String name;
    bool condition = true;

    while(condition)
    {
        if(ExistInFirstDataStructure(name))
        {
           //increment name
        }
        else
        {
           if(ExistInDeletedDataStructure(String name))
           {
               //increment name
           }
           else
           {
               condition = false;
           }

        }
    }


    bool ExistInFirstDataStructure(String name)
    {

    }

    bool ExistInDeletedDataStructure(String name)
    {

    }
0 голосов
/ 26 октября 2011

Зачем вообще использовать цикл ?? (Я знаю LINQ будет под капотом)

var LastUsedObjectName =
    MyObjects.Select(mo => mo.Name)
             .Union( MyDeletedObjects.Select(mo => mo.Name))
             .OrderByDescending(name => /*Function to order by integer part of name*/).First();

// Now add 1 to LastUseObjectName and use that.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...