2

是否可以将项目插入到特定索引中的 NameValueCollection 中?我没有看到 Insert() 方法。

4

3 回答 3

2

这是Insert扩展方法的实现NameValueCollection

static class ColExtensions
{
    private class KeyValuesPair
    {
        public string Name { get; set; }
        public string[] Values { get; set; }
    }

    public static void Insert(this NameValueCollection col, int index, string name, string value)
    {
        if (index < 0 || index > col.Count)
            throw new ArgumentOutOfRangeException();

        if (col.GetKey(index) == value)
        {
            col.Add(name, value);
        }
        else
        {
            List<KeyValuesPair> items = new List<KeyValuesPair>();
            int size = col.Count;
            for (int i = index; i < size; i++)
            {
                string key = col.GetKey(index);
                items.Add(new KeyValuesPair
                {
                    Name = key,
                    Values = col.GetValues(index),
                });
                col.Remove(key);
            }

            col.Add(name, value);

            foreach (var item in items)
            {
                foreach (var v in item.Values)
                {
                    col.Add(item.Name, v);
                }
            }
        }
    }
}
于 2009-12-17T18:27:53.450 回答
1

不,没有在特定索引处插入项目的方法。但是,为此编写扩展方法应该是微不足道的。

您使用 NameValueCollection 的原因是什么?

于 2009-12-17T17:32:15.907 回答
0

这并不是NameValueCollections 的真正含义。如果您需要以这种方式操作您的集合,您应该考虑使用不同的数据结构 ( OrderedDictionary?)。也就是说,这是一个扩展方法,可以满足您的需求:

static class NameValueCollectionExtensions {
    public static void Insert(this NameValueCollection collection, int index, string key, string value) {
        int count = collection.Count;
        if (index < 0 || index > count) {
            throw new ArgumentOutOfRangeException("index");
        }
        List<string> keys = new List<string>(collection.AllKeys);
        List<string> values = keys.Select(k => collection[k]).ToList();
        keys.Insert(index, key);
        values.Insert(index, value);
        collection.Clear();
        for (int i = 0; i <= count; i++) {
            collection.Add(keys[i], values[i]);
        }
    }
}

我不知道collection.AllKeys保证按插入的顺序返回密钥。如果您可以找到说明这种情况的文档,那么上述情况很好。否则,换行

List<string> keys = new List<string>(collection.AllKeys);

List<string> keys = new List<string>();
for(int i = 0; i < count; i++) {
    keys.Add(collection.Keys[i]);
}
于 2009-12-17T17:48:48.277 回答