C# 比较两个逗号分隔字符串是否匹配的最短代码是什么?
下面名为UserCanAccessThisPage的方法基于以下逻辑:每个用户和每个页面都有一个组列表。如果其中任何一个匹配,则用户可以访问该页面 下面的代码符合我的要求,但我的解决方案是C#1(或C#2,至少我没有使用ArrayList) 任何人都可以重构这个使其更直接,例如使用lambdas来消除这两种方法吗?我就是不懂语法C# 比较两个逗号分隔字符串是否匹配的最短代码是什么?,c#,lambda,C#,Lambda,下面名为UserCanAccessThisPage的方法基于以下逻辑:每个用户和每个页面都有一个组列表。如果其中任何一个匹配,则用户可以访问该页面 下面的代码符合我的要求,但我的解决方案是C#1(或C#2,至少我没有使用ArrayList) 任何人都可以重构这个使其更直接,例如使用lambdas来消除这两种方法吗?我就是不懂语法 using System; using System.Collections.Generic; using System.Linq; namespace TestCo
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;
}
}
}
我使用的代码是:
但是Shaul正确地假设PageItems也可以有多个条目,例如“members,guests”,因此我实际上使用了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 pageitems accessgroups){
列出userAccessGroupsList=StringHelpers.SplitAndTrimCommaDelimitedString(userAccessGroups);
List pageItemAccessGroupList=StringHelpers.SplitAndTrimCommaDelimitedString(pageItemAccessGroups);
返回userAccessGroupsList.Any(userAccessGroup=>pageItemAccessGroupList.Any(pageItemAccessGroup=>userAccessGroup==pageItemAccessGroup));
}
公共静态列表SplitAndTrimCommaDelimitedString(字符串行){
返回行.Split(',')。选择(s=>s.Trim()).ToList();
}
好的,你说你想要小巧的。。。!
:)
public static bool UserCanAccessThisPage(string userAccessGroups,string pageitems accessgroups){
列出userAccessGroupsList=StringHelpers.SplitAndTrimCommaDelimitedString(userAccessGroups);
List pageItemAccessGroupList=StringHelpers.SplitAndTrimCommaDelimitedString(pageItemAccessGroups);
返回userAccessGroupsList.Any(userAccessGroup=>pageItemAccessGroupList.Any(pageItemAccessGroup=>userAccessGroup==pageItemAccessGroup));
//或:
//返回userAccessGroupsList.Any(userAccessGroup=>pageItemAccessGroupList.Contains(userAccessGroup));
}
公共静态列表SplitAndTrimCommaDelimitedString(字符串行){
返回行.Split(',')。选择(s=>s.Trim()).ToList();
}
好的,你说你想要小巧的。。。!
:)
public static bool UserCanAccessThisPage(string userAccessGroups,string pageitems accessgroups){
列出userAccessGroupsList=StringHelpers.SplitAndTrimCommaDelimitedString(userAccessGroups);
List pageItemAccessGroupList=StringHelpers.SplitAndTrimCommaDelimitedString(pageItemAccessGroups);
返回userAccessGroupsList.Any(userAccessGroup=>pageItemAccessGroupList.Any(pageItemAccessGroup=>userAccessGroup==pageItemAccessGroup));
//或:
//返回userAccessGroupsList.Any(userAccessGroup=>pageItemAccessGroupList.Contains(userAccessGroup));
}
公共静态列表SplitAndTrimCommaDelimitedString(字符串行){
返回行.Split(',')。选择(s=>s.Trim()).ToList();
}
类似(抱歉,手头没有IDE)
public static bool UserCanAccessThisPage(string userAccessGroups,string pageitems accessgroups)
{
列出userAccessGroupsList=StringHelpers.SplitAndTrimCommaDelimitedString(userAccessGroups);
List pageItemAccessGroupList=StringHelpers.SplitAndTrimCommaDelimitedString(pageItemAccessGroups);
返回userAccessGroupsList。其中(
uag=>pageItemAccessGroupList.Contains(uag)).Count>0;
}
公共静态列表SplitAndTrimCommaDelimitedString(字符串行)
{
返回行.Split(',')。选择(s=>s.Trim()).ToList();
}
我真的不认为有两个方法有什么大问题,因为功能很好地分开了,但是我想如果你真的想,你可以将代码从第二个方法内联移动到第一个方法。类似这样的东西(对不起,没有IDE可供使用)
public static bool UserCanAccessThisPage(string userAccessGroups,string pageitems accessgroups)
{
列出userAccessGroupsList=StringHelpers.SplitAndTrimCommaDelimitedString(userAccessGroups);
List pageItemAccessGroupList=StringHelpers.SplitAndTrimCommaDelimitedString(pageItemAccessGroups);
返回userAccessGroupsList。其中(
uag=>pageItemAccessGroupList.Contains(uag)).Count>0;
}
公共静态列表SplitAndTrimCommaDelimitedString(字符串行)
{
返回行.Split(',')。选择(s=>s.Trim()).ToList();
}
我真的不认为有两个方法会有什么大问题,因为功能很好地分开了,但我想如果您真的愿意,您可以将代码从第二个方法内联移动到第一个方法。StringHelper可以如下所示:
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
}
}
StringHelper可以如下所示:
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
}
}
拥有两个
IEnumerable
s后,可以使用Intersect
功能:
return userGroups.Intersect(pageGroups).Count > 0;
在这种情况下,您需要页面上用户的完整权限列表。但是,我要用Shaul的例子:
Any
函数更快,它应该在第一次匹配时停止。一旦有了两个IEnumerable
s,就可以使用Intersect
函数:
return userGroups.Intersect(pageGroups).Count > 0;
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()));
}
在这种情况下,您需要页面上用户的完整权限列表。然而,我还是要用Shaul的例子:
Any
函数更快,它应该在第一次匹配时停止。公共静态bool用户可以访问此页面(
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()));
}
字符串userAccessGroups、字符串pageItemAccessGroups)
{
HashSet u=新的HashSet(
userAccessGroups.Split(',')。选择(x=>x.Trim());
返回u.Overlaps(pageItemAccessGroups.Split(',')。选择(x=>x.Trim());
}
公共静态bool用户可以访问此页面(
字符串userAccessGroups、字符串pageItemAccessGroups)
{
HashSet u=新的HashSet(
userAccessGroups.Split(',')。选择(x=>x.Trim());
返回u.Overlaps(pageItemAccessGroups.Split(',')。选择(x=>x.Trim());
}
我不确定这是否可行,因为pageItemAccessGroups也是一个逗号分隔的字符串,但正如我在回答中所说,我现在手头没有IDE可供检查。我注意到最初的实现也拆分了pageItemAccessGroups,但没有