Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较两个逗号分隔字符串是否匹配的最短代码是什么?_C#_Lambda - Fatal编程技术网

C# 比较两个逗号分隔字符串是否匹配的最短代码是什么?

C# 比较两个逗号分隔字符串是否匹配的最短代码是什么?,c#,lambda,C#,Lambda,下面名为UserCanAccessThisPage的方法基于以下逻辑:每个用户和每个页面都有一个组列表。如果其中任何一个匹配,则用户可以访问该页面 下面的代码符合我的要求,但我的解决方案是C#1(或C#2,至少我没有使用ArrayList) 任何人都可以重构这个使其更直接,例如使用lambdas来消除这两种方法吗?我就是不懂语法 using System; using System.Collections.Generic; using System.Linq; namespace TestCo

下面名为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;
        }
    }
}
我使用的代码是: 但是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,但没有