1

asp.net C#4 我有一个简单的类来处理查询字符串。

一个新的实例是这样创建的:

        public QueryString(string querystring)
    {
        try
        {
            _table = new Hashtable();
            if (querystring.Length > 0)
            {
                foreach (string pair in querystring.Split('&'))
                {
                    string[] item = pair.Split('=');
                    _table.Add(item[0].ToLower(), item[1]);
                }
            }
        }
        catch (Exception)
        {
        }
    }

我想为此添加一个删除键值对的方法。我不希望它返回一个新的查询字符串,我只是希望它从当前实例中删除该对。不知道该怎么做,因为它说我无法为“this”赋值

        public void Remove(string key)
    {

        String querystring = this.ToString();
        try
        {
            _table = new Hashtable();
            if (key.Length > 0)
            {
                foreach (string pair in querystring.Split('&'))
                {
                    string[] item = pair.Split('=');
                    if (item[0] != key)
                    {
                        _table.Add(item[0].ToLower(), item[1]);
                    }

                }
                this = _table;
            }
        }
        catch (Exception)
        {
        }
    }
4

3 回答 3

2

你把事情复杂化了。由于您的班级状态由该_table字段组成,您需要做的就是从该字段中删除具有给定键的项目。

以下示例用强类型字典替换您的无类型哈希表。我还选择使用 LINQ 语句初始化字典,但如果您愿意,可以将旧代码保留在那里。

public class QueryString
{
    private readonly Dictionary<string, string> _table;

    public QueryString(string querystring)
    {
        if (querystring.Length > 0)
        {
            var pairs = 
                from pair in querystring.Split('&')
                let item = pair.Split('=')
                select new {key = item[0], value = item[1]};
            _table = pairs.ToDictionary(p => p.key, p => p.value);
        }
    }

    public void Remove(string key)
    {
        _table.Remove(key);
    }
}
于 2013-05-15T20:37:38.797 回答
0

您不能为其赋值,this因为它是对对象本身的引用

但是,如果您删除该行this = _table;,那么事情是否会按应有的方式工作?我猜您ToString()在某种程度上使用哈希表来生成“打印机友好”的 QueryString,如果是这种情况,按照我的看法,您的Remove()方法应该有效(因为您将_table变量替换为HashTable不包括密钥的新变量-要排除的值对)。

于 2013-05-15T20:13:50.160 回答
0

您正在将查询字符串传递给类,因此原始查询字符串完好无损

但是,然后您将查询字符串分解为键/值对的哈希表。如果您想保持完整,您需要克隆 HashTable 并在克隆上执行删除

在任何情况下,将作为构造函数参数传入的查询字符串保留在成员变量中以安全保存可能是个好主意。

于 2013-05-15T20:25:50.753 回答