是否可以将项目插入到特定索引中的 NameValueCollection 中?我没有看到 Insert() 方法。
问问题
4566 次
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
这并不是NameValueCollection
s 的真正含义。如果您需要以这种方式操作您的集合,您应该考虑使用不同的数据结构 ( 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 回答