什么是最短的代码来比较两个逗号分隔字符串匹配? [英] What is the shortest code to compare two comma-separated strings for a match?

查看:229
本文介绍了什么是最短的代码来比较两个逗号分隔字符串匹配?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下调用的方法的 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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆