开发者

Insert into NameValueCollection in .NET

Is it possible to insert an item into a NameValueCollection in a specific index? I don't开发者_如何学编程 see an Insert() method.


Here's an implementation of an Insert extension method for 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);
                }
            }
        }
    }
}


No, there is no method to insert an item at a specific index. However, it should be trivial to write a extension method for doing that.

What's the reason you're using a NameValueCollection?


This is not really what NameValueCollections are meant for; if you need to manipulate your collection in this way you should consider a different data structure (OrderedDictionary?). That said, here's an extension method that will do what you want:

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]);
        }
    }
}

I don't know that collection.AllKeys is guaranteed to return the keys in the order that they were inserted. If you can find documentation stating that this is the case then the above is fine. Otherwise, replace the line

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

with

List<string> keys = new List<string>();
for(int i = 0; i < count; i++) {
    keys.Add(collection.Keys[i]);
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜