将一个字符串拆分为一个唯一的列表-重构它
本文关键字:一个 列表 重构 拆分 字符串 唯一 | 更新日期: 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);
谨致问候。