Вставить в NameValueCollection в .NET - PullRequest
2 голосов
/ 17 декабря 2009

Можно ли вставить элемент в коллекцию NameValueCollection в определенном индексе? Я не вижу метод Insert ().

Ответы [ 3 ]

1 голос
/ 17 декабря 2009

Вот реализация метода расширения 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);
                }
            }
        }
    }
}
1 голос
/ 17 декабря 2009

Нет, нет способа вставить элемент по определенному индексу. Тем не менее, это должно быть тривиально написать метод расширения для этого.

По какой причине вы используете NameValueCollection?

0 голосов
/ 17 декабря 2009

Это не совсем то, для чего предназначены NameValueCollection с; если вам нужно манипулировать вашей коллекцией таким образом, вам следует рассмотреть другую структуру данных (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]);
}
...