2012-01-31 58 views
3

好吧,這看起來很醜:)重構這段代碼的好方法是什麼?將一個字符串分割成一個唯一的列表 - 重構此

Users是在屏幕上輸入的數據,並在這個例子中,我們希望不同的結果在_someDTOObject.Users

string[] userNames = Users.Split(new char[] { ',' }); 
string tempUserStr = ""; 
foreach (string user in userNames) 
{ 
    tempUserStr += user.Trim().ToUpper() + ","; 
} 

userNames = tempUserStr.Split(new char[] { ',' }); 
var uniqueUsers = userNames.Distinct().ToList(); 

foreach (string user in uniqueUsers) 
{ 
    if (!string.IsNullOrEmpty(user)) 
    { 
     _someDTOObject.Users += user + ","; 
    } 
} 
+3

你爲什麼分裂,然後加入,然後再分裂? – 2012-01-31 18:57:48

+0

@JonSkeet--似乎是爲了解決他的「不同的」要求。 – EBarr 2012-01-31 18:58:38

+0

@EBarr:不,對'Distinct()'的調用做到了這一點...... – 2012-01-31 18:59:15

回答

9

看起來像你可能想是這樣的:

_someDTOObject.Users = string.Join(",", Users.Split(',') 
              .Select(x => x.Trim().ToUpper()) 
              .Distinct()); 

...但我不清楚你爲什麼要通過分割/連接/分割開始...

注意:如果您使用的是.NET 3.5,則在Distinct後需要額外撥打ToArray。你不在.NET 4上,因爲string.Join過載的集合已經增加。

(如StriplingWarrior的回答指出,這不會有後面的逗號你尾隨逗號。?)

+0

喬恩你的答案看起來是正確的,看起來他正在構建某種逗號分隔的用戶列表 – MethodMan 2012-01-31 19:01:03

+0

謝謝 - <<但我不清楚你爲什麼要通過分割/連接/分割來開始... >>我也不確定,這就是爲什麼我問,因爲它看起來不正確。我會回去檢查我的要求。您的LINQ答案的作品,也感謝.NET 3.5的注意事項。 如果沒有LINQ(只是好奇),你會怎麼做? – VoodooChild 2012-01-31 19:13:06

+0

我不希望後面的逗號(其實沒關係),我認爲這就是爲什麼我有'if(!string.IsNullOrEmpty(user))'檢查第二個foreach循環 – VoodooChild 2012-01-31 19:15:43

3

這是更清潔的方式多爲得到同樣的結果:

var distinctUsers = 
    (from user in Users.Split(new[]{','}) 
    select trimmedUpper = user.Trim().ToUpper()) 
    .Distinct() 

_someDTOObject.Users = string.Join(",", distinctUsers); 

然而,這不會有尾隨「」,其可以是或不是期望的。您也可能想要檢查爲什麼您需要首先使用逗號分隔的列表。是否有可能會更好地傳遞用戶名列表呢?

2

這將負責刪除重複和空的名稱。

string Users = "bob, bill, james, frank, , bill"; 
var z = Users.Split(new char[] {','}, StringSplitOptions.RemoveEmptyEntries).Select(x=> x.Trim().ToUpper()).Distinct().ToArray(); 
var result = string.Join(",", z); 
0

我希望這可以是有用的。

_someDTOObject.Users = Users.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(user => user.Trim().ToUpper()).Distinct().Aggregate((users, user) => users + "," + user); 

問候。

相關問題