在一个LINQ语句中选择值并在其后附加数字?

Xai*_*oft 5 c# linq

我的数据库中有以下两个名称:SMITHSMITH1

如果在数据库中存在一个名称,那么如果仅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

Jef*_*eff 0

这是一种非常幼稚但易于阅读的方法来完成您想要做的事情:

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

有很多方法可以提高效率,但有些方法会牺牲可读性。

如果需要的话,我会将这段代码的优化作为练习留给您。