[英]What is the shortest code to compare two comma-separated strings for a match?
下面稱為UserCanAccessThisPage的方法基於以下邏輯:每個用戶和每個頁面都有一個組列表。 如果其中任何一項匹配,則用戶可以訪問該頁面。
下面的代碼做了我想要的,但我的解決方案是非常 C# 1 (或 C# 2,至少我沒有使用 ArrayList)。
任何人都可以重構這個使其更直接,例如使用 lambdas 來取消這兩種方法嗎? 我只是無法獲得這樣做的語法。
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;
}
}
}
Fredrik 有最簡潔的代碼來解決上面的原始任務:
public static bool UserCanAccessThisPage(string userAccessGroups, string pageItemAccessGroups)
{
return userAccessGroups
.Split(',')
.Select(s => s.Trim())
.Contains(pageItemAccessGroups);
}
但是 Shaul 假設 PageItems 也可以有多個條目是正確的,例如“成員,客人”,所以我實際上使用了 Shaul 的代碼:
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();
}
好吧,你說你想要緊湊......! :)
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));
// or:
// return userAccessGroupsList.Any(userAccessGroup => pageItemAccessGroupList.Contains(userAccessGroup));
}
public static List<string> SplitAndTrimCommaDelimitedString(string line) {
return line.Split(',').Select(s => s.Trim()).ToList();
}
StringHelpers 可能如下所示:
public class StringHelpers
{
private static readonly char[] separator = ",".ToCharArray();
public static bool UserCanAccessThisPage(
string userAccessGroups,
string pageItemAccessGroups)
{
return userAccessGroups
.Split(separator) // split on comma
.Select(s => s.Trim()) // trim elements
.Contains(pageItemAccessGroups); // match
}
}
public static bool UserCanAccessThisPage(
string userAccessGroups, string pageItemAccessGroups)
{
HashSet<string> u = new HashSet<string>(
userAccessGroups.Split(',').Select(x => x.Trim()));
return u.Overlaps(pageItemAccessGroups.Split(',').Select(x => x.Trim()));
}
一旦你有了兩個IEnumerable<string>
,你就可以使用Intersect
函數:
return userGroups.Intersect(pageGroups).Count > 0;
這是為了防止您需要頁面上用戶的完整權限列表。
但是,我會使用 Shaul 的示例: Any
函數更快,它應該在第一場比賽時停止。
類似的東西(抱歉沒有 IDE)
public static bool UserCanAccessThisPage(string userAccessGroups, string pageItemAccessGroups)
{
List<string> userAccessGroupsList = StringHelpers.SplitAndTrimCommaDelimitedString(userAccessGroups);
List<string> pageItemAccessGroupList = StringHelpers.SplitAndTrimCommaDelimitedString(pageItemAccessGroups);
return userAccessGroupsList.Where(
uag => pageItemAccessGroupList.Contains(uag)).Count > 0;
}
public static List<string> SplitAndTrimCommaDelimitedString(string line)
{
return line.Split(',').Select(s => s.Trim()).ToList<string>();
}
我真的不認為它有兩種方法有什么大問題,因為功能很好地分開了,但我想如果你真的想要的話,你可以將代碼從第二個方法內聯移動到第一個方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.