C# 将字符串拆分为唯一列表-重构此

C# 将字符串拆分为唯一列表-重构此,c#,string,refactoring,C#,String,Refactoring,好的,这看起来很难看:)重构这段代码的好方法是什么 Users是在屏幕上输入的数据,在本例中,我们希望在\u someDTOObject.Users string[] userNames = Users.Split(new char[] { ',' }); string tempUserStr = ""; foreach (string user in userNames) { tempUserStr += user.Trim().ToUpper() + ","; } userName

好的,这看起来很难看:)重构这段代码的好方法是什么

Users
是在屏幕上输入的数据,在本例中,我们希望在
\u 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 + ",";
    }   
}
看起来您可能需要以下内容:

_someDTOObject.Users = string.Join(",", Users.Split(',')
                                             .Select(x => x.Trim().ToUpper())
                                             .Distinct());
。。。但我不清楚你为什么要从…开始进行拆分/加入/拆分

注意:如果您使用的是.NET3.5,则需要在
Distinct
之后进行额外的
ToArray
调用。由于
string.Join
重载的集合已增加,因此在.NET4上您不需要这样做


(如StriplingWarrior的回答中所述,这不会有尾随逗号。您想要尾随逗号吗?

这是一种更简洁的方法,可以获得大致相同的结果:

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

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

然而,这将不会有一个尾随“,”,这可能是可取的,也可能是不可取的。您可能还想首先检查为什么需要以逗号分隔的列表结束。您是否最好传递一个用户名列表?

这将负责删除重复的空名称

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); 

我希望这会有用

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

问候。

你为什么要拆分,然后加入,然后再拆分?@JonSkeet-似乎满足了他的“独特”要求。@EBarr:不,调用
distinct()
可以做到这一点……我想我应该在第一个块中执行IsNullOrEmpty检查,所以如果列表是空的,它甚至都不会进入列表。@CarlManaster:注意到-谢谢。Jon你的答案看起来是正确的,好像他正在创建某种逗号分隔的用户列表谢谢-我也不确定,这就是为什么我问这个问题,因为它看起来不正确。我会回去检查我的要求。您的LINQ答案有效,同时感谢.NET3.5上的注释。如果没有LINQ(只是好奇),你会怎么做呢?我不想要后面的逗号(实际上没关系),我想这就是为什么我要
if(!string.IsNullOrEmpty(user))
检查第二个foreachloop@VoodooChild:这不会阻止你得到一个尾随逗号-看看你的循环;如果您有任何非空字符串,那么肯定会有一个尾随逗号。至于在没有LINQ的情况下做这件事。。。嗯,如果我不得不使用.NET2.0,我可能会使用
字典。。。