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.

User Admin Manager を返却したいだけです

C#でこれを行うための最良のアプローチは何ですか?

私の推測では、次の項目に移動する前に、foreach を実行して各ループの部分文字列を置き換え、値を再入力する必要があると思います。

まだ構文の問題につまずいているように見えるので、コードサンプルを提供していただければ幸いです。

とても有難い!

4

7 に答える 7

2

LINQ でそれを行うことができます。

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

編集: このメソッドは、roles. これは非常に大まかなストロークであり、言及した置換のみを行いたい場合は、別のラムダ関数を使用する必要がある場合があります。そのためのヘルプについては、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 に答える
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;
}

string文字列コレクションでこの置換を行う必要がない場合、xは変数であると想定しました

于 2013-04-22T17:53:28.937 に答える
0

あなたの問題を正しく理解している場合は、文字列内の「Sub」の出現を削除する必要があります。「Sub」が文字列の先頭にある、大文字と小文字を区別しないなど、他の条件がある場合は、追加のチェックを行うことができます。

方法の 1 つは、削除する文字列のインデックスを見つけてから削除することです。

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 に答える