我的数据库中有以下两个名称:SMITH和SMITH1
如果在数据库中存在一个名称,那么如果仅SMITH存在一个数据库,我想在其后附加一个1,并且如果已经存在一个带有数字的名称,则希望增加该名称的数字部分。
是否可以在一个LINQ状态下执行此操作?现在,我正在做:
string name = string.Format("{0}{1}{2}",first_name,middle_name,last_name).ToUpper();
//Check for duplicates
while(names.SingleOrDefault (d => d.Name== name) != null)
{
//Get last char
char lastChar = name[name.Length - 1];
//Last char is number
if(Char.IsNumber(lastChar))
{
name = name.Replace(lastChar,Convert.ToChar(Convert.ToInt32(lastChar) + 1));
}
else
{
name = (name + 1);
}
}
Run Code Online (Sandbox Code Playgroud)
由于我的while循环中有LINQ查询,因此它每次循环返回时都会进行选择吗?
另外,如果有人知道一种使这种方式更简洁但可读性更高的方法,那会很棒吗?
这确实适用于没有数字或1-9的名称,但是当我达到10时会发生什么,它将仅替换最后一个字符,在这种情况下为0,我该如何处理呢?
有没有办法在LINQ中获得数字部分,所以SMITH12会返回12
这是一种非常幼稚但易于阅读的方法来完成您想要做的事情:
//Check for duplicates
bool nameValid = names.SingleOrDefault (d => d.Name == name) == null;
int count = 1;
while(!nameValid)
{
if( names.SingleOrDefault (d => d.Name == name + count.ToString()) == null )
{
name = name + count.ToString();
nameValid = true;
}
else
{
count++;
}
}
// name now contains a unique name
Run Code Online (Sandbox Code Playgroud)
有很多方法可以提高效率,但有些方法会牺牲可读性。
如果需要的话,我会将这段代码的优化作为练习留给您。