我需要在C#中使用两种不同的数据结构进行搜索,这是交易:
我有一个名字(这是一个字符串),我想进行搜索。我有一个名为Exists
的函数,它将返回一个bool
,表示它是否存在。
如果它存在,我增加名称(只需在字符串的末尾添加1),然后我需要再次执行搜索(通过方法exists
)以查看是否有一个对象新名称存在。
这将继续,直到有一个未使用的名称,我可以使用,但是,如果它不存在,现在我应该执行搜索另一个数据结构,其中包含已删除的对象,如果字符串是在那里发现,然后我必须再次增加名称,并从头开始搜索。
如果没有使用Exists
方法的对象,也没有使用所有已删除对象的数据结构,这都将结束。
我怎么能解决这个问题?
我希望我能清楚地表达自己: - )
提前多多感谢!
答案 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
}