如何从包含4个单词的名称中拆分名字和姓氏。在C#中并在Mysql中使用它进行查询

时间:2011-11-15 18:17:58

标签: c# asp.net mysql

我从列表框中获取用户名,我将第一个名称和姓氏分开,然后使用它来从DB中查找用户ID,

 string FirstName = li.Value.Split(' ')[0].Trim();
   string lastName = li.Value.Split(' ')[1].Trim();

但对我而言,这个棘手的部分是当用户名是Mark Van Harm Jiti时,名字是Mark Van而Surname是Harm Jiti。但是我的代码将Mark作为名字而Van作为姓氏。但我不知道哪个是名字,哪个是姓氏。我只是从列表框中找到Mark Van Harm Jiti的文本。我应该如何更改我的查询,以便获得用户Mark Van Harm Jiti的用户ID

string getuserid = "SELECT UserID from tbl_User Where FirstName=@FirstName AND LastName=@LastName";

我使用的是Mysql DB,它是c#代码。

5 个答案:

答案 0 :(得分:4)

如果您可以安全地假设姓氏是最后一个令牌,则可以执行以下操作。

string[] tokens = li.Value.Split(' ');
string firstName = tokens[0].Trim();
string lastName = tokens[tokens.Length - 1].Trim();

然而,这是一个不好的假设(参见LuizInácioLulada Silva,他的姓氏是“da Silva”或Cristiano Ronaldo dos Santos Aveiro,他的姓氏是“dos Santos Aveiro”)。最好不要处于必须从单个字符串中识别名字和姓氏的位置。

  

但对我而言,这个棘手的部分是用户名是Mark Van Harm Jiti,第一个名字是Mark Van,姓氏是Harm Jiti。但是我的代码将Mark作为名字而Van作为姓氏。

是的,请注意,这样的示例基本上确认您在尝试从单个字符串中确定名字和姓氏时采用了错误的方法。没有逻辑,有时会挑出最后两个令牌,有时只挑出最后一个令牌(我的兄弟有两个中间名,所以你不能使用总是拿最后两个令牌的逻辑因为“Mark Van Harm”吉提“这是对的,但按照我哥哥的名字,这是错误的。”

答案 1 :(得分:0)

我认为您需要进行字数统计以检查名称中的字数,然后根据计数分支逻辑。我的字数统计功能如下。我使用它来检查文本字段中的标记数量,然后依赖于拆分和插入的数字,或者仅仅插入1个标记。我认为你需要的是类似的东西。基于Van和Harm之间的分数。

     Public Shared Function WordCount(ByVal s As String) As Int32
        Dim collection As MatchCollection = Regex.Matches(s, "[\S]+")
        Return collection.Count
    End Function

答案 2 :(得分:0)

也许您正在错误地进行此操作。 ListBox是如何填充的?填充ListBox时,是否可以为每个ListItem值存储UserID?如果你这样做,你可以访问ListBox的SelectedValue来获取UserID。

答案 3 :(得分:0)

我相信你可以调整你的查询:

string getuserid = "SELECT UserID from tbl_User Where CONCAT(FirstName,' ', LastName)=@userName";

并将您的代码更改为:

string userName = li.Value.Trim();

答案 4 :(得分:0)

我能想到涵盖所有可能性的唯一方法是检查所有排列。 SQL语句最终应该像这样结束:

  

(FirstName ='Mark Van Harm'和LastName ='Jiti)或(FirstName =   'Mark Van'和LastName ='Harm Jiti)或(FirstName ='Mark'AND   LastName ='Van Harm Jiti)

如果这是您感兴趣的方法,请告诉我,我们非常乐意提供一些示例代码