2013-04-22 106 views
1

我有以下方法返回一个集合,然后我可以在MVC中构建一个下拉菜单。问题是,我想要替换集合中值的子字符串,但我不知道如何在C#中完成此操作(我是一个经典的VB人)。C#如何在集合上进行字符串替换方法?

public class RolesManagement 
{ 
    public static IEnumerable<string> BuildRoles(string DesiredRole) 
    { 
     var UserRoles = Roles.GetAllRoles(); 

     IEnumerable<string> roles; 
     roles = UserRoles.Where(x => x.Contains("Sub")).Except(rejectAdmin); 
     return roles; 
    } 

} 

为简洁起见,上述内容已经过简化。角色集合中的每个角色如下所示: SubUser SubAdmin SubManager。

我只是想回到 用户 联系 经理

什么是最好的办法为这个在C#中吗?

我的猜测是我必须做一个foreach并替换每个循环的子字符串,并在移动到下一个项目之前重新填充该值。

如果你可以提供一个很好的代码示例,因为我似乎还在跳过语法问题。

非常感谢!

+0

对不起,我不明白你是什么'rejectAdmin'什么'roles'应该包含并且你想要替换什么? – MoHaKa 2013-04-22 17:48:01

+0

该查询列出了我不想在角色集合中返回的其他选项。你不需要担心这一点。只要知道这个linq返回SubUser,SubAdmin,SubManager。但我希望这显示为用户,管理员,经理。谢谢! – 2013-04-22 17:50:41

回答

2

你可以做到这一点与LINQ。

roles = UserRoles 
    .Where(x => x.Contains("Sub")) 
    .Except(rejectAdmin) 
    .Select(x => x.Replace("Sub", "")); 

编辑:请注意,此方法只替换所有的字符串的字符串“分”中出现的所有roles。这是一个非常宽泛的中风,如果你只想做你提到的替换,你可能需要使用不同的lambda函数。看到Romoku的帖子寻求帮助。

+0

谢谢你。我选择了这个回应,因为它是我最初的代码最接近的方法。这很好,可以在LINQ中处理。 – 2013-04-22 18:36:35

1

我会说,如果角色不会经常改变,然后做一个映射Dictionary

public class RolesManagement 
{ 
    private static readonly Dictionary<string,string> RoleMapping = 
     new Dictionary<string,string> 
     { 
      {"SubUser", "User" }, 
      {"SubManager", "Manager" }, 
      {"SubAdmin", "Admin" } 
     }; 

    public static IEnumerable<string> BuildRoles(string DesiredRole) 
    { 
     var UserRoles = Roles.GetAllRoles(); 

     IEnumerable<string> roles; 
     roles = UserRoles.Where(x => x.Contains("Sub")).Except(rejectAdmin); 
     return roles.Select(r => RoleMapping.ContainsKey(r) ? RoleMapping[r] : r); 
    } 
} 

或者只是它们存储在数据库作为FriendlyName柱内。

0
public static IEnumerable<string> GetCorrectedRoleNames(IEnumerable<string> roles) 
{ 
    List<string> correctedRoles = new List<string>(); 
    foreach (string role in roles) 
     correctedRoles.Add(Regex.Replace(role, "Sub", string.Empty)); 
    return correctedRoles.AsEnumerable(); 
} 
0
public static IEnumerable<string> BuildRoles(string DesiredRole) 
{ 
    var UserRoles = Roles.GetAllRoles(); 

    IEnumerable<string> roles; 
    roles = UserRoles.Where(x => x.Contains("Sub")).Except(rejectAdmin).Select(x=>x.Replace("Sub",""); 
    return roles; 
} 

我推测,x为string变量如果不是你必须这样做替换字符串集合

0

如果我理解你的问题是正确的,你需要删除字符串中出现的“Sub”。如果您有其他条件,如“Sub”位于字符串的开头,不区分大小写等,您可以执行其他检查。

其中一种方法是找到要删除的字符串的索引,然后去掉。

var s = "SubUser"; 
var t = s.Remove(s.IndexOf("Sub"), "Sub".Length); 

或者,您也可以用空字符串替换要删除的字符串。

var t = s.Replace("Sub", ""); 

希望有所帮助。

0

试试这个

List<string> x = new List<string>(); 
x.Add("SubUser"); 
x.Add("SubAdmin"); 
x.Add("SubManager"); 

var m = x.Select(y => y.Replace("Sub", "")); 
1

这将返回所有项目进行分开始,与子去除

IEnumerable<string> = UserRoles .Where(x => x.StartsWith("sub")) .Select(y => y.Remove(0,3));