什么是最短的代码来比较两个逗号分隔字符串匹配? [英] What is the shortest code to compare two comma-separated strings for a match?
问题描述
以下调用的方法的 UserCanAccessThisPage 是基于以下逻辑:每个用户和每个网页都有组的列表。如果这些匹配,用户访问页面。
下面的代码我想要做什么,但我的解决方案是非常C#1 (或C#2,至少我没有使用ArrayList)。
任何人都可以重构这个所以它更直接,例如使用lambda表达式废除两种方法?我只是不能得到语法来做到这一点。
使用系统;
使用System.Collections.Generic;
使用System.Linq的;
命名空间TestCompare2343
{
类节目
{
静态无效的主要(字串[] args)
{
串anonymousUserAccessGroups =loggedOutUsers;
串normalUserAccessGroups =loggedInUsers,成员;
串developerUserAccessGroups =loggedInUsers,成员,管理员,开发人员;
串loginPageAccessGroups =loggedOutUsers;
串logoutPageAccessGroups =loggedInUsers;
串memberInfoPageAccessGroups =成员;
串devPageAccessGroups =开发商;
//测试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(---);
//测试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(---);
//测试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();
}
}
公共类StringHelpers
{
公共静态布尔UserCanAccessThisPage(字符串userAccessGroups,串pageItemAccessGroups)
{
名单,LT;字符串> userAccessGroupsList = StringHelpers.SplitAndTrimCommaDelimitedString(userAccessGroups);
名单,LT;字符串> pageItemAccessGroupList = StringHelpers.SplitAndTrimCommaDelimitedString(pageItemAccessGroups);
的foreach(在userAccessGroupsList串userAccessGroup)
{
的foreach(在pageItemAccessGroupList串pageItemAccessGroup)
{
如果(userAccessGroup == pageItemAccessGroup)
返回真;
}
}
返回FALSE;
}
公共静态列表<串GT; SplitAndTrimCommaDelimitedString(串线)
{
名单,LT;字符串> piecesWithSpaces = line.Split(,)了ToList&所述;串GT;();
名单,LT;字符串> piecesWithoutSpaces =新的List<串GT;();
的foreach(在piecesWithSpaces串pieceWithSpace)
{
piecesWithoutSpaces.Add(pieceWithSpace.Trim());
}
返回piecesWithoutSpaces;
}
}
}
答:
弗雷德里克过的最简洁的代码,解决了上面的原始任务:
公共静态布尔UserCanAccessThisPage(串userAccessGroups,串pageItemAccessGroups)
{
返回userAccessGroups
.Split(,)
。选择(S => s.Trim())
。载有(pageItemAccessGroups);
}
我使用的代码:
但扫罗在假设PageItems也可以有多个条目正确,如的成员,客人,所以我实际使用沙乌尔代码:
公共静态布尔UserCanAccessThisPage(字符串userAccessGroups,串pageItemAccessGroups){
名单,LT;字符串> userAccessGroupsList = StringHelpers.SplitAndTrimCommaDelimitedString(userAccessGroups);
名单,LT;字符串> pageItemAccessGroupList = StringHelpers.SplitAndTrimCommaDelimitedString(pageItemAccessGroups);
返回userAccessGroupsList.Any(userAccessGroup => pageItemAccessGroupList.Any(pageItemAccessGroup => userAccessGroup == pageItemAccessGroup));
}
公共静态列表<串GT; SplitAndTrimCommaDelimitedString(串线){
返回line.Split(,)选择(S => s.Trim())。了ToList();
}
StringHelpers看起来是这样的:
公共类StringHelpers
{
私人静态只读的char []分隔符=,。ToCharArray( );
公共静态布尔UserCanAccessThisPage(
串userAccessGroups,
串pageItemAccessGroups)
{
返回userAccessGroups
.Split(分隔符)//在逗号$ B分割$ b。选择(S = GT; s.Trim())//饰件
。载有(pageItemAccessGroups); //匹配
}
}
The method below called UserCanAccessThisPage is based on the following logic: each user and each page has a list of groups. If any of these match, the user has access to the page.
The code below does what I want, but my solution is very C# 1 (or C# 2, at least I didn't use ArrayList).
Can anyone refactor this so it is more straight-forward, e.g. using lambdas to do away with the two methods? I just can't get the syntax to do it.
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;
}
}
}
Answer:
Fredrik had the most concise code that solved the original task above:
public static bool UserCanAccessThisPage(string userAccessGroups, string pageItemAccessGroups)
{
return userAccessGroups
.Split(',')
.Select(s => s.Trim())
.Contains(pageItemAccessGroups);
}
The code I used:
But Shaul was correct in assuming that the PageItems can also have multiple entries, e.g. "members,guests", and so I actually used Shaul's code:
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();
}
StringHelpers could look like this:
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
}
}
这篇关于什么是最短的代码来比较两个逗号分隔字符串匹配?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!