1

我有以下方法返回一个集合,因此我可以从 MVC 中构建一个下拉菜单。问题是,我想替换集合中的值中的子字符串,但我不确定如何在 C# 中这样做(我是一个经典的 vb 人)。

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 并替换每个循环上的子字符串并在移动到下一个项目之前重新填充该值。

如果您可以提供一个很棒的代码示例,因为我似乎仍然会因语法问题而绊倒。

非常感激!

4

7 回答 7

2

你可以用 LINQ 做到这一点。

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

编辑:请注意,此方法只是替换所有字符串中所有出现的字符串“Sub” roles。这是一个非常广泛的行程,如果您只想进行您提到的替换,您可能需要使用不同的 lambda 函数。请参阅 Romoku 的帖子以获取帮助。

于 2013-04-22T17:54:23.380 回答
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列存储在数据库中。

于 2013-04-22T17:52:17.210 回答
1

这将返回所有以 sub 开头的项目,删除 sub

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

于 2013-04-22T18:01:01.140 回答
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();
}
于 2013-04-22T17:52:36.150 回答
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可变的,如果不是你必须在字符串集合上执行此替换

于 2013-04-22T17:53:28.937 回答
0

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

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

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

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

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

希望有帮助。

于 2013-04-22T17:54:31.907 回答
0

试试这个

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

var m = x.Select( y => y.Replace("Sub", ""));
于 2013-04-22T18:00:38.110 回答