разбить строку в уникальный список - рефакторинг это - PullRequest
3 голосов
/ 31 января 2012

Хорошо, это выглядит ужасно :) Какой хороший способ реорганизовать этот блок кода?

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 + ",";
    }   
}

Ответы [ 4 ]

9 голосов
/ 31 января 2012

Это выглядит так, как будто вы, вероятно, хотите что-то вроде:

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

... но мне не ясно, почему вы начинаете с split / join / split, чтобы начать с...

Примечание: если вы используете .NET 3.5, вам потребуется дополнительный вызов ToArray после Distinct.Вы не работаете в .NET 4, поскольку набор перегрузок string.Join увеличен.

(Как отмечено в ответе StriplingWarrior, у него не будет запятой. Вы хотели хотеть запятая?)

3 голосов
/ 31 января 2012

Это гораздо более чистый способ получения в основном того же результата:

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

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

Однако, это не будет иметь конечный ",", который может или не может бытьжелательно.Возможно, вы также захотите выяснить, почему вы должны в конце концов получить список через запятую.Возможно ли, что вместо этого вам лучше будет передать список имен пользователей?

2 голосов
/ 31 января 2012

Это позаботится об удалении дублированных и пустых имен.

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 голосов
/ 31 января 2012

Надеюсь, это может быть полезно.

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

Привет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...