有没有简单的方法可以根据 C# 中的键对 NameValueCollection 进行排序?

发布于 2024-07-14 22:56:06 字数 65 浏览 5 评论 0 原文

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

I am looking for an easy way to sort NameValueCollection on the basis of key - it should not be a performance heavy though.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

深海里的那抹蓝 2024-07-21 22:56:06

SortedDictionarySortedList 开始,您就已经在那里了...

如果您需要每个键多个项目,请考虑SortedDictionary>。 有一些方法可以通过扩展方法来简化加法等 - 这并不可怕。

另请注意,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);
    }

Start with SortedDictionary<string,string> or SortedList<string,string> and you're already there...

If you need the multiple items per key, then consider a SortedDictionary<string,List<string>>. There are ways to simplify addition etc with extension methods - it needn't be scary.

Note also that NameValueCollection is case-insensitive, so you might need to use one of the insensitive comparisons - for example:

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

(edit) here's an example of using an extension method to populate multiple values against a single key in 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);
    }
缘字诀 2024-07-21 22:56:06

这是一个我不太引以为豪的强力破解方法,但如果您需要一些快速而肮脏的东西,它就有效。

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

Here's a brute force hack that I'm not too proud of, but it works if you need something quick and dirty.

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);
    }
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文