1

我有一个要求,说明如下:

"系统将验证导入文件中的用户名是否已被使用,并根据重复格式生成用户名 示例:如果用户名 suesmith 正在使用,系统将使用 suesmith1 作为用户名。如果 suesmith1 正在使用, 系统将使用 suesmith2 作为用户名"

基本上假设在我的用户表中,我已经有用户 suesmith,并且我有一个从 csv 文件导入新用户的功能。如果在该文件中存在 suesmith,它的行为应该与该要求中的一样。

我从以下开始:

var usernameFromFile = userInfoFromFile.Username;
var existingUsernames = this.accountCreationService.GetSimilarUsernamesBasedOnProvidedUsernameFromGlobal(userInfoFromFile.Username, serverInfoForGlobalDatabase, globalDatabaseName).Where(x => x.StartsWith(usernameFromFile)).ToArray(); 

// userInfoFromFile 是一个从文件中填充数据的对象,该对象用于创建新的用户帐户,因此在此对象中我需要保存用户名

// 函数 GetSimilarUsernamesBasedOnProvidedUsernameFromGlobal 运行 sql 查询:SELECT us.Username FROM Users us where us.Username LIKE '%usernameFromFile%' 并且在返回字符串 [] 的查询之后,我放置了 Where 条件以仅检索这些用户名以文件中的用户名开头(因此不包括 12suesmith 或 abcsuesmith 之类的用户名)

我继续这样:

                    var usernamesInCriteria = new Dictionary<string, int?>();
                    ///var usernamesInCriteria = new List<string>();

                    for (int i = 0; i < existingUsernames.Length; i++)
                    {
                        var stringAfterUsername = existingUsernames[i].Substring(usernameFromFile.Length);
                       
                        int numberInUsername;
                        var isNumber = int.TryParse(stringAfterUsername, out numberInUsername);

                        if (stringAfterUsername.IsNullOrEmpty() || isNumber)
                        {
                            usernamesInCriteria.Add(existingUsernames[i], numberInUsername);
                            ///usernamesInCriteria.Add(existingUsernames[i]); //in this list the same username (if exists) and usernames followed by numbers only will be stored     
                        }                                
                    }

                    foreach (var pair in usernamesInCriteria)
                    {
                        if (pair.Key == userInfoFromFile.Username)
                        {

                        }
                    }

基本上,对于该现有用户名数组中的每个用户名,我检查了 usernameFromFile 之后是否有一个数字子字符串,如果有,则将这些现有用户名添加到字典中(并且通过stringAfterUsername.IsNullOrEmpty()还包括现有用户名,例如苏史密斯)

但进一步我不确定该怎么做,因为我已经获得了所有以数字结尾的相似用户名。所以我不知道如何验证 suesmith 用户名是否已经存在,如果存在,则追加 1,然后检查 suesmith1 是否存在,追加 2 等等......如果你能告诉我如何开始!

4

1 回答 1

1

怎么样:

if (existingUsernames.Contains(username))
{
    username = Enumerable.Range(1, Int32.MaxValue)
        .Select(i => $"{username}{i}")
        .Where(s => !existingUsernames.Contains(s))
        .First();
}

在您现有的用户名查询中,您应该从LIKE '%usernameFromFile%'.

于 2022-02-05T18:46:58.827 回答