将一个字符串拆分为一个唯一的列表-重构它

本文关键字:一个 列表 重构 拆分 字符串 唯一 | 更新日期: 2023-09-27 18:22:06

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

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

将一个字符串拆分为一个唯一的列表-重构它

看起来你可能想要这样的东西:

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

但我不清楚你为什么要从拆分/加入/拆分开始。。。

注意:如果您使用的是.NET 3.5,则在Distinct之后需要一个额外的ToArray调用。您不在.NET4上,因为string.Join重载集已经增加。

(正如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);

谨致问候。