操纵和比较字符串的最佳方法

vto*_*ola 1 .net c# string

我正在开发一个REST服务,所以请求可能是这样的:

/数据/主/表=客户/

我需要逐个获取段,并且对于每个段,我将决定我将要使用的对象,在我将查询的其余部分传递给该对象之后,它可以决定下一步做什么.基本上,REST查询是树上的路径:P

这意味着很多String操作(取决于查询复杂性),但StringBuilder仅用于连接和删除,您不能使用IndexOf或类似的搜索执行.

我已经开发了这个满足我要求的类,但问题是操作字符串,所以每次我得到一个段......我会创建额外的字符串,因为String是一个不可变的数据类型:

public class RESTQueryParser
{
    String _query;

    public RESTQueryParser(String query)
    {
        _query = query;
    }

    public String GetNext()
    {
        String result = String.Empty;
        Int32 startPosition = _query.StartsWith("/", StringComparison.InvariantCultureIgnoreCase) ? 1 : 0;

        Int32 i = _query.IndexOf("/", startPosition, StringComparison.InvariantCultureIgnoreCase) - 1;

        if (!String.IsNullOrEmpty(_query))
        {
            if (i < 0)
            {
                result = _query.Substring(startPosition, _query.Length - 1);
                _query = String.Empty;
            }
            else
            {
                result = _query.Substring(startPosition, i);
                _query = _query.Remove(0, i + 1);
            }
        }

        return result;
    }
}
Run Code Online (Sandbox Code Playgroud)

服务器应该支持很多调用,查询可能很大,所以这将是一个非常重复的任务.我真的不知道对内存和性能的影响有多大,我只是在一些书中对它进行了研究.

我应该实现一个管理Char []的类而不是字符串并实现我想要的方法吗?或者应该对这个好吗?正则表达式可能?

更新:

上面的类只是一个小的aproximation,我还在研究它,我必须解析更复杂的模式.

我无法使用WCF REST或预定义路径(例如将正则表达式映射到特定方法),因为用户可以在运行时更改查询格式.所以必须逐步解析.

我不能使用String.Split,因为例如查询可能是:"Data/Search = '01/01/2008'/ Whatever".

kem*_*002 8

除非你反对使用它.我会在这里查看

http://msdn.microsoft.com/en-us/netframework/cc950529.aspx

WCF为您处理REST实现.无需解析URL.

如果您必须手动解析查询,我会使用

string[] queryParts = query.Trim('/').Split('/');
Run Code Online (Sandbox Code Playgroud)

您可以单独浏览每个部分,而无需使用IndexOf.

String.Split方法:http: //msdn.microsoft.com/en-us/library/system.string.split.aspx

如果您不打算使用WCF并且它是REST实现,那么您要做的是将您的变量信息放在查询字符串参数中

/Data/Main/Table=Customers/  
Run Code Online (Sandbox Code Playgroud)

真的需要:

/Data/Main?Table=Customers
Run Code Online (Sandbox Code Playgroud)

要么

/Data/Main/Table/Customers
Run Code Online (Sandbox Code Playgroud)

您将需要一种方法将路径路径与查询变量分开.复杂性需要是查询字符串的一部分,而不是基本URI的一部分.然后你可以把变量分开出去?并通过拆分&来分离出每个查询表达式.

string[] uriAndQueryItems = query.Split('?');

if(uriAndQueryItems.Length > 1)
{
   foreach(string queryItem in uriAndQueryItems.Split('&'))
   {
    //do something here.
   }
}
Run Code Online (Sandbox Code Playgroud)