6

我正在寻找一种简单的方法来根据键对 NameValueCollection 进行排序 - 但它不应该是一个沉重的性能。

4

2 回答 2

13

SortedDictionary<string,string>从or开始SortedList<string,string>,你已经在那里了......

如果每个键需要多个项目,请考虑使用SortedDictionary<string,List<string>>. 有一些方法可以通过扩展方法来简化加法等 - 它不必很可怕。

另请注意,这NameValueCollection是不区分大小写的,因此您可能需要使用其中一种不区分大小写的比较 - 例如:

Dictionary<string,string> data = new Dictionary<string,string>(
            StringComparer.InvariantCultureIgnoreCase);

(编辑)这是使用扩展方法在 C# 3.0 中针对单个键填充多个值的示例:

    static void Main()
    {
        var data = new Dictionary<string, List<string>>(
            StringComparer.InvariantCultureIgnoreCase);
        data.Add("abc", "def");
        data.Add("abc", "ghi");
    }

    static void Add<TKey, TValue>(this IDictionary<TKey, List<TValue>> lookup,
        TKey key, TValue value)
    {
        List<TValue> list;
        if (!lookup.TryGetValue(key, out list))
        {
            list = new List<TValue>();
            lookup.Add(key, list);
        }
        list.Add(value);
    }
于 2009-03-09T20:07:26.860 回答
2

这是我不太引以为豪的蛮力破解,但如果您需要快速而肮脏的东西,它就可以工作。

public static void Sort(this NameValueCollection nameValueCollection)
    {
        // Create a temporary collection the same size as the original
        NameValueCollection tempNameValueCollection = new NameValueCollection(nameValueCollection.Count);

        // Sort the keys
        string[] keys = nameValueCollection.AllKeys;
        Array.Sort(keys);

        foreach (string key in keys)
        {
            // Sort the values
            string[] values = nameValueCollection[key].Split(',');
            Array.Sort(values);

            // Add each value to the temporary collection
            foreach (string value in values)
            {
                tempNameValueCollection.Add(key, value);
            }
        }

        // Clear the original collection
        nameValueCollection.Clear();

        // Add the sorted entries back
        nameValueCollection.Add(tempNameValueCollection);
    }
于 2009-03-09T20:28:17.093 回答