我在数据库中保存文件名。在保存之前,我正在检查数据库中是否存在文件名。如果是,我想在文件名之后附加一个唯一的ID,例如(1)或(2),等等在文件名之后。
一切正常,但是当我从检索到的列表和数据库中删除文件时,有时会获得重复的文件名。我的代码是:
var count = dbitems().Count(x.Name == name || x.Name.Contains(name + "("));
if (count > 0)
{
name = name + string.Format("({0})", count);
}
假设我保存了4个名称为
的文件(1) File
(2) File(1)
(3) File(2)
(4) File(3)
从这个列表中我删除了文件(2)。当我尝试保存名为“File”的文件时,我的输出是File(3),但这已经存在。所需的输出应为“文件(2)”(删除(2)并且可以分配此名称)或“文件(4)”。我尝试过count + 1,但这也造成了问题。
简单来说,我希望像Windows资源管理器这样的行为创建一个自动指定唯一后缀的新名称。
答案 0 :(得分:1)
你必须循环:
string origName = name;
int version = 0;
while(dbitems().Count(x.Name == name) > 0)
{
name = origName + string.Format("({0})", ++version);
}
这会尝试名称,名称(1),名称(2),......直到找到一个空闲的“插槽”。它也适用于
姓名,姓名(1),姓名(5),姓名(6)
已经存在
答案 1 :(得分:0)
谢谢大家的帮助。我感谢你们所有人。以下是我实施的解决方案。
public string UniqueName(string name, int parentId)
{
var files = allFiles.Where(x => x.ParentId == parentId).ToList();
var newName = name;
if (files.Count() > 0)
{
for (var i = 1; i <= matches; i++)
{
if (files.Any(x => x.Name == newName
newName = string.Format("{0}({1})", name, i);
else
return newName
}
}
return newName
}
答案 2 :(得分:-1)
您需要检查每个候选人姓名,所以可能更像是:
int count = 0;
string baseName = name;
while (dbitems().Any(x.Name == name))
{
count++;
name = string.Format("{1} ({0})", count, baseName);
}