Метод, названный ниже UserCanAccessThisPage , основан на следующей логике: у каждого пользователя и каждой страницы есть список групп. Если что-либо из этого совпадает, пользователь имеет доступ к странице.
Код ниже делает то, что я хочу, но мое решение очень C # 1 (или C # 2, по крайней мере, я не использовал ArrayList).
Может ли кто-нибудь рефакторинг этого , чтобы он был более простым, например, используя лямбды, чтобы покончить с двумя методами? Я просто не могу получить синтаксис для этого.
using System;
using System.Collections.Generic;
using System.Linq;
namespace TestCompare2343
{
class Program
{
static void Main(string[] args)
{
string anonymousUserAccessGroups = "loggedOutUsers";
string normalUserAccessGroups = "loggedInUsers, members";
string developerUserAccessGroups = "loggedInUsers, members, administrators, developers";
string loginPageAccessGroups = "loggedOutUsers";
string logoutPageAccessGroups = "loggedInUsers";
string memberInfoPageAccessGroups = "members";
string devPageAccessGroups = "developers";
//test anonymousUser
Console.WriteLine(StringHelpers.UserCanAccessThisPage(anonymousUserAccessGroups, loginPageAccessGroups));
Console.WriteLine(StringHelpers.UserCanAccessThisPage(anonymousUserAccessGroups, logoutPageAccessGroups));
Console.WriteLine(StringHelpers.UserCanAccessThisPage(anonymousUserAccessGroups, memberInfoPageAccessGroups));
Console.WriteLine(StringHelpers.UserCanAccessThisPage(anonymousUserAccessGroups, devPageAccessGroups));
Console.WriteLine("---");
//test anonymousUser
Console.WriteLine(StringHelpers.UserCanAccessThisPage(normalUserAccessGroups, loginPageAccessGroups));
Console.WriteLine(StringHelpers.UserCanAccessThisPage(normalUserAccessGroups, logoutPageAccessGroups));
Console.WriteLine(StringHelpers.UserCanAccessThisPage(normalUserAccessGroups, memberInfoPageAccessGroups));
Console.WriteLine(StringHelpers.UserCanAccessThisPage(normalUserAccessGroups, devPageAccessGroups));
Console.WriteLine("---");
//test anonymousUser
Console.WriteLine(StringHelpers.UserCanAccessThisPage(developerUserAccessGroups, loginPageAccessGroups));
Console.WriteLine(StringHelpers.UserCanAccessThisPage(developerUserAccessGroups, logoutPageAccessGroups));
Console.WriteLine(StringHelpers.UserCanAccessThisPage(developerUserAccessGroups, memberInfoPageAccessGroups));
Console.WriteLine(StringHelpers.UserCanAccessThisPage(developerUserAccessGroups, devPageAccessGroups));
Console.WriteLine("---");
Console.ReadLine();
}
}
public class StringHelpers
{
public static bool UserCanAccessThisPage(string userAccessGroups, string pageItemAccessGroups)
{
List<string> userAccessGroupsList = StringHelpers.SplitAndTrimCommaDelimitedString(userAccessGroups);
List<string> pageItemAccessGroupList = StringHelpers.SplitAndTrimCommaDelimitedString(pageItemAccessGroups);
foreach (string userAccessGroup in userAccessGroupsList)
{
foreach (string pageItemAccessGroup in pageItemAccessGroupList)
{
if (userAccessGroup == pageItemAccessGroup)
return true;
}
}
return false;
}
public static List<string> SplitAndTrimCommaDelimitedString(string line)
{
List<string> piecesWithSpaces = line.Split(',').ToList<string>();
List<string> piecesWithoutSpaces = new List<string>();
foreach (string pieceWithSpace in piecesWithSpaces)
{
piecesWithoutSpaces.Add(pieceWithSpace.Trim());
}
return piecesWithoutSpaces;
}
}
}
Ответ:
У Фредрика был самый лаконичный код, который решал исходную задачу выше:
public static bool UserCanAccessThisPage(string userAccessGroups, string pageItemAccessGroups)
{
return userAccessGroups
.Split(',')
.Select(s => s.Trim())
.Contains(pageItemAccessGroups);
}
Код, который я использовал:
Но Шауль был прав, предполагая, что PageItems также может иметь несколько записей, например «члены, гости», и поэтому я фактически использовал код Шаула:
public static bool UserCanAccessThisPage(string userAccessGroups, string pageItemAccessGroups) {
List<string> userAccessGroupsList = StringHelpers.SplitAndTrimCommaDelimitedString(userAccessGroups);
List<string> pageItemAccessGroupList = StringHelpers.SplitAndTrimCommaDelimitedString(pageItemAccessGroups);
return userAccessGroupsList.Any(userAccessGroup => pageItemAccessGroupList.Any(pageItemAccessGroup => userAccessGroup == pageItemAccessGroup));
}
public static List<string> SplitAndTrimCommaDelimitedString(string line) {
return line.Split(',').Select(s => s.Trim()).ToList();
}