QueryBuilder: A Simple Way to Read and Write Query Strings

本文介绍了一个简单的方法来读取和编写查询字符串,通过创建一个名为 QueryParameter 的类来封装参数名和值,并提供了方便的方法来添加、删除和获取参数。

QueryBuilder: A Simple Way to Read and Write Query Strings

http://www.codeproject.com/Articles/875164/QueryBuilder-A-Simple-Way-to-Read-and-Write-Query

代码下载地址:http://pan.baidu.com/s/1ntuWEpV

namespace TestApplication.Query
{
    public class QueryParameter
    {
        public string Name { get; set; }
        public string Value { get; set; }
        internal bool IsFirst { get; set; }

        public QueryParameter(string name, string value)
        {
            this.Name = name;
            this.Value = value;
        }

        public QueryParameter(string name)
            : this(name, "")
        { }

        public static QueryParameter Create(string parameter)
        {
            string trimmed = parameter.Replace("&", "").Replace("?", "");
            if (trimmed.Contains("="))
            {
                string[] split = trimmed.Split('=');
                return new QueryParameter(split[0], split[1]);
            }
            return new QueryParameter(trimmed);
        }

        private string Flatten()
        {
            return (this.IsFirst ? '?' : '&') + this.Name +
                   (string.IsNullOrEmpty(this.Value) ? "" : "=") + this.Value;
        }

        public override string ToString() { return this.Flatten(); }

        //...

    }
}

using System.Collections.Generic;
using System.Linq;

namespace TestApplication.Query
{
    public class QueryBuilder
    {
        private List<QueryParameter> _parameters;
        public QueryBuilder()
        {
            _parameters = new List<QueryParameter>();
        }

        public QueryParameter this[int index]
        {
            get { return _parameters[index]; }
        }

        public string this[string name]
        {
            get
            {
                return HasParameter(name) ?
                    _parameters.Find(x => x.Name == name).Value : null;
            }
        }

        public bool HasParameter(string name)
        {
            return _parameters.Exists(p => p.Name == name);
        }

        #region method

        public void AddParameter(QueryParameter parameter)
        {
            _parameters.Add(parameter);
            _parameters.Last().IsFirst = (_parameters.Count == 1);
        }
        public void AddParameter(string name, string value)
        {
            AddParameter(new QueryParameter(name, value));
        }
        public void RemoveParameter(QueryParameter parameter)
        {
            _parameters.Remove(parameter);
        }
        public void RemoveParameter(string name)
        {
            QueryParameter param = _parameters.Find(x => x.Name == name);
            _parameters.Remove(param);
        }

        public static QueryBuilder Create(string queryString)
        {
            QueryBuilder toReturn = new QueryBuilder();
            if (queryString.Contains('&'))
            {
                string[] arr = queryString.Split('&');
                foreach (string p in arr)
                {
                    toReturn.AddParameter(QueryParameter.Create(p));
                }
            }
            else
            {
                toReturn.AddParameter(QueryParameter.Create(queryString));
            }
            return toReturn;
        }
        private string CompileQueryString()
        {
            string toReturn = "";
            foreach (QueryParameter p in _parameters)
            {
                toReturn += p.ToString();
            }
            return toReturn;
        }

        public override string ToString() { return CompileQueryString(); }

        #endregion

        //...

    }
}
//测试下

class Program
    {
        static void Main(string[] args)
        {
            Query.QueryBuilder querybuilder = new Query.QueryBuilder();
            querybuilder.AddParameter("name", "jon");
            querybuilder.AddParameter("bb", "123");
            querybuilder.AddParameter("aa", "mike");
            querybuilder.AddParameter("cc", "hello");
            Console.WriteLine(querybuilder.ToString());
            Console.ReadKey();
        }

        //..

    }
?name=jon&bb=123&aa=mike&cc=hello



“Kuroni and Simple Strings” 通常是 Codeforces 等竞赛平台上的一道题目。该问题一般是关于字符串处理的,核心是对给定字符串进行特定操作以达到某种目标,例如删除最少数量的字符对,使得字符串满足特定条件。 以下是一个可能的解决思路和示例代码: 假设问题是要从一个由 `(` 和 `)` 组成的字符串中,尽可能多地删除合法的括号对(即 `()` )。 ```cpp #include <iostream> #include <string> #include <vector> // 解决 Kuroni and Simple Strings 问题的函数 std::vector<int> solveKuroni(const std::string& s) { std::vector<int> leftIndices; std::vector<int> rightIndices; std::vector<int> result; for (int i = 0; i < s.length(); ++i) { if (s[i] == '(') { leftIndices.push_back(i + 1); } else { if (!leftIndices.empty()) { result.push_back(leftIndices.back()); leftIndices.pop_back(); result.push_back(i + 1); } } } return result; } int main() { std::string s; std::cin >> s; std::vector<int> solution = solveKuroni(s); if (solution.empty()) { std::cout << 0 << std::endl; } else { std::cout << 1 << std::endl; std::cout << solution.size() << std::endl; for (int index : solution) { std::cout << index << " "; } std::cout << std::endl; } return 0; } ``` ### 代码解释 1. **函数 `solveKuroni`**: - 维护两个向量 `leftIndices` 和 `rightIndices` 分别存储左括号和右括号的索引。 - 遍历字符串,遇到左括号时将其索引加入 `leftIndices`,遇到右括号时,如果 `leftIndices` 不为空,则取出一个左括号的索引,将这对括号的索引加入结果向量 `result`。 2. **主函数 `main`**: - 读取输入的字符串。 - 调用 `solveKuroni` 函数得到结果。 - 根据结果是否为空输出相应信息。如果结果不为空,输出操作次数(这里假设为 1 次)、删除的字符数量以及这些字符的索引。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值