2012-10-01 42 views
1

我卡住的情況下,我想爲給定的用戶名生成密碼。技術迭代通過名字,姓氏創建用戶名

我從用戶的輸入通過文本框爲FirstName和LastName,由用戶的姓氏+ firstname的第一個字母創建一個用戶名。對於e.x.,如果用戶的名字是'Ronald'並且姓氏是'Test',那麼我將數據庫中的用戶名添加爲'Testr'。但是,如果我對其他用戶有相同的姓氏和名字具有相同的名稱作爲數據庫中現有的用戶開始,我加名字的前兩個字母是這樣 -

if (entities.Users.Any(a => a.LastName == tbLname.Text && a.FirstName.StartsWith(fname))) 
username = (tbLname.Text + tbFname.Text.Substring(0,2)).ToLower(); 

現在的問題是,這僅適用於前兩個字母與名字相匹配的情況。如果我有3個甚至4個名字匹配,該怎麼辦?我沒有線索如何檢查剩餘的字符有一個唯一的用戶名。

有關如何實現這一點的任何想法? 在此先感謝。

+3

你有什麼規則,如果用戶有相同的名字和姓氏作爲另一個用戶?如果發生這種情況,你的應用程序就會中斷 –

+0

你可能不得不重新考慮這一點。您將無法每次都基於姓氏和名字動態生成用戶名,因爲您永遠無法知道您可能擁有多少匹配的名稱。也許第一次生成一個用戶名,然後相應地存儲它。 –

+0

爲什麼不只是做一個檢查,看看他們是否是相同的用戶名,然後附加一個增量數字呢?因此,第一個將是'Testr',第二個將是'Testr1'等。 – MyCodeSucks

回答

5

如果應用程序想要避免錯誤,OP上還需要更多的信息,但同時這應該解決手頭的問題。

//Store the first possible name. 
var possibleUsername = string.Format("{0}{1}", tbLname.Text, tbFname.Text.Substring(0,1)) 

//Don't hit the database N times, instead get all the possible names in one shot. 
var existingUsers = entities.Users.Where(u => u.Username.StartsWith(possibleUsername)).ToList(); 

//Find the first possible open username. 
if (existingUsers.Count == 0) { 
    //Create the user since the username is open. 
} else { 
    //Iterate through all the possible usernames and create it when a spot is open. 
    for(var i = 1; i < existingUsers.Count; i++) { 
     if (existingUsers.FirstOrDefault(u => u.Username == string.Format("{0}{1}", tbLname.Text, tbFname.Text.Substring(0, i))) == null) { 
      //Create the user since the user name is open. 
     } 
    } 
} 
+0

真棒!謝謝Ek0nomik!我正在扭動我的大腦來達成這樣的解決方案。只是學習Linq,Asp.net ...感謝您的幫助。 – Ron

+0

作品像一個魅力:) – Ron

+0

謝謝你這樣一個很好的解決方案。但有一個小問題,它應該是var existingUsers = entities.Users.Where(u => u.Username.StartsWith(possibleUsername))。ToList();需要一個).ToList() –