C#:在两种不同的数据结构中进行递归搜索

时间:2011-10-26 07:30:56

标签: c# data-structures recursion

我需要在C#中使用两种不同的数据结构进行搜索,这是交易: 我有一个名字(这是一个字符串),我想进行搜索。我有一个名为Exists的函数,它将返回一个bool,表示它是否存在。

如果它存在,我增加名称(只需在字符串的末尾添加1),然后我需要再次执行搜索(通过方法exists)以查看是否有一个对象新名称存在。

这将继续,直到有一个未使用的名称,我可以使用,但是,如果它不存在,现在我应该执行搜索另一个数据结构,其中包含已删除的对象,如果字符串是在那里发现,然后我必须再次增加名称,并从头开始搜索。 如果没有使用Exists方法的对象,也没有使用所有已删除对象的数据结构,这都将结束。

我怎么能解决这个问题?

我希望我能清楚地表达自己: - )

提前多多感谢!

5 个答案:

答案 0 :(得分:2)

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”。如果是,则递增该数字。正确?

答案 1 :(得分:0)

为什么要使用循环? (我知道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.

答案 2 :(得分:0)

非递归和简单的解决方案可能是这样的(在这种情况下我不认为有任何递归的需要)

   //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)
    {

    }

答案 3 :(得分:0)

这个怎么样:

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);

答案 4 :(得分:0)

如果为两个数据结构创建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
}